WPF中的自动模板选择不使用接口
我有一个WPF中的自动模板选择不使用接口,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,我有一个TreeView绑定到Tileset列表Tileset包含TileGroup,TileGroup同时包含TileGroup和TileRun实例。Tile和TileRun都实现了ITile,但最终会有更多的类型实现ITile 我有以下XAML: <TreeView Grid.Row="0" Grid.Column="0" BorderThickness="0" ItemsSource="{Binding Path=Tilesets}">
TreeView
绑定到Tileset
列表Tileset
包含TileGroup
,TileGroup
同时包含TileGroup
和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
,一切都会很好。不过我不想这样做,因为最终会有更多的类实现ITile
我知道我可以使用DataTemplateSelector
处理这个问题,但如果可能的话,我希望使用纯XAML解决方案
我是做错了什么,还是WPF不支持这种基于接口的自动模板选择
我是做错了什么,还是WPF不支持这种基于接口的自动模板选择
你没有做错什么。这种对接口的数据绑定支持根本不受支持。有关原因的更多信息,请参考MSDN论坛下面帖子中Beatriz Costa(MSFT)的回答
数据模板和接口:
“数据绑定团队不久前讨论了添加对接口的支持,但最终没有实现它,因为我们无法为它提供一个好的设计。问题是接口不像对象类型那样具有层次结构。考虑数据源同时实现IMyTrimeFre1和IyInTrimeFe2的场景,并且对于资源中的两个接口都有数据板:您认为我们应该选择哪个数据板?
当对对象类型执行隐式数据模板时,我们首先尝试为确切的类型找到一个DataTemplate,然后为其父类、祖辈等找到一个DataTemplate。有非常明确的类型顺序供我们应用。当我们谈到添加对接口的支持时,我们考虑使用反射来查找所有接口,并将它们添加到类型列表的末尾。我们遇到的问题是在类型实现多个接口时定义接口的顺序。”
因此,您必须明确地为平铺和平铺定义一个DataTemplate,或者使用DataTemplateSelector。可能的重复项