我有一个TreeView
绑定到一个Tileset
列表。Tileset
包含TileGroup
,TileGroup
包含Tile
和TileRun
示例。Tile
和TileRun
都实现了ITile
,但最终会有更多类型实现ITile
我有以下XAML:
<TreeView
Grid.Row="0"
Grid.Column="0"
BorderThickness="0"
ItemsSource="{Binding Path=Tilesets}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Tileset}" ItemsSource="{Binding Path=TileGroups}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:TileGroup}" ItemsSource="{Binding Path=Tiles}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type tiles:ITile}">
<TextBlock Text="{Binding Path=Name}" />
</DataTemplate>
</TreeView.Resources>
</TreeView>
Tileset
和TileGroup
选择了正确的DataTemplate
,但ITile
没有选择,没有选择模板,树只显示数据类型。
但是,如果我为Tile
和TileRun
显式添加一个DataTemplate
,一切都很好。
我知道我可以使用DataTemplateSelector
来处理这个问题,但如果可能的话,我希望使用纯XAML解决方案。
是我做错了什么,还是WPF不支持这种基于接口的自动模板选择?
2条答案
按热度按时间t40tm48m1#
是我做错了什么,还是WPF不支持这种基于接口的自动模板选择?
你没有做错什么。接口的这种数据绑定支持根本不受支持。请参阅Beatriz Costa(MSFT)在MSDN论坛上的以下帖子中的回答,以了解有关原因的更多信息。
数据模板及接口:https://social.msdn.microsoft.com/Forums/vstudio/en-US/1e774a24-0deb-4acd-a719-32abd847041d/data-templates-and-interfaces?forum=wpf
因此,您必须为Tile和TileRun显式定义DataTemplate,或者使用DataTemplateSelector。
q0qdq0h22#
下面是我的
InheritanceDataTemplateSelector
,它只适用于接口:使用方法:
在
Resources
部分,像往常一样定义每个DataTemplate
,现在每个DataType
都是一个接口,而不是具体类型:然后,为
InheritanceDataTemplateSelector
再添加一个资源:然后,在需要使用
DataTemplate
的正确位置,指定应该使用此选择器。例如,在ItemsControl
中:注意:ViewModel接口不必扩展
INotifyPropertyChanged
。ViewModel的具体实现可以*实现它,如果需要。还要注意:如果你的视图模型实现了多个接口,并且你碰巧为多个这样的接口定义了一个DataTemplate,这个选择器将只返回第一个匹配的DataTemplate。它只是进行广度优先的搜索,自定义其搜索策略应该是相当简单的。