我有一个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
没有选择,没有选择模板,树只显示数据类型。
但是,如果我明确地为DataTemplate
和Tile
添加了TileRun
,那么一切都很有效。我不想这样做,因为最终会有更多实施ITile
的课程。
我知道我可以使用DataTemplateSelector
来处理这个问题,但如果可能的话,我想要一个纯XAML解决方案。
我在这里做错了什么,或者WPF是否不支持基于接口的这种类型的自动模板选择?
答案 0 :(得分:3)
我在这里做错了什么,或者WPF是否不支持基于接口的这种类型的自动模板选择?
你没有做错事。这种对接口的数据绑定支持根本不受支持。有关原因的更多信息,请参阅MSDN论坛以下主题中的Beatriz Costa(MSFT)答案。
“数据绑定团队讨论了不久前添加对接口的支持,但最终没有实现它,因为我们无法为它提出一个好的设计。问题是接口没有类似的层次结构对象类型。考虑数据源同时实现IMyInterface1和IMyInterface2以及资源中这两个接口的DataTemplates的场景:您认为我们应该选择哪个DataTemplate?
在对对象类型进行隐式数据模板化时,我们首先尝试查找确切类型的DataTemplate,然后查找其父级,祖父级等等。我们可以应用非常明确的类型顺序。当我们谈到添加对接口的支持时,我们考虑使用反射来找出所有接口并将它们添加到类型列表的末尾。我们遇到的问题是当类型实现多个接口时定义接口的顺序。“
因此,您必须明确地为Tile和TileRun定义DataTemplate或使用DataTemplateSelector。