Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF中的自动模板选择不使用接口_Wpf_Xaml_Mvvm - Fatal编程技术网

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。

可能的重复项