WPF中的自动模板选择不适用于接口

时间:2016-12-30 01:22:44

标签: wpf xaml mvvm

我有一个TreeView绑定到Tileset列表。 Tileset包含TileGroupTileGroup包含TileTileRun个实例。 TileTileRun都会实现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>

TilesetTileGroup选择正确的DataTemplate,但ITile没有选择,没有选择模板,树只显示数据类型。

但是,如果我明确地为DataTemplateTile添加了TileRun,那么一切都很有效。我不想这样做,因为最终会有更多实施ITile的课程。

我知道我可以使用DataTemplateSelector来处理这个问题,但如果可能的话,我想要一个纯XAML解决方案。

我在这里做错了什么,或者WPF是否不支持基于接口的这种类型的自动模板选择?

1 个答案:

答案 0 :(得分:3)

  

我在这里做错了什么,或者WPF是否不支持基于接口的这种类型的自动模板选择?

你没有做错事。这种对接口的数据绑定支持根本不受支持。有关原因的更多信息,请参阅MSDN论坛以下主题中的Beatriz Costa(MSFT)答案。

数据模板和界面: https://social.msdn.microsoft.com/Forums/vstudio/en-US/1e774a24-0deb-4acd-a719-32abd847041d/data-templates-and-interfaces?forum=wpf

“数据绑定团队讨论了不久前添加对接口的支持,但最终没有实现它,因为我们无法为它提出一个好的设计。问题是接口没有类似的层次结构对象类型。考虑数据源同时实现IMyInterface1和IMyInterface2以及资源中这两个接口的DataTemplates的场景:您认为我们应该选择哪个DataTemplate?

在对对象类型进行隐式数据模板化时,我们首先尝试查找确切类型的DataTemplate,然后查找其父级,祖父级等等。我们可以应用非常明确的类型顺序。当我们谈到添加对接口的支持时,我们考虑使用反射来找出所有接口并将它们添加到类型列表的末尾。我们遇到的问题是当类型实现多个接口时定义接口的顺序。“

因此,您必须明确地为Tile和TileRun定义DataTemplate或使用DataTemplateSelector。