问题

我有一个IThing的集合,我想为HierarchicalDataTemplate创建一个TreeView。简单的DataType={x:Type local:IThing}当然是行不通的,可能是因为WPF的创建者不想处理可能的歧义。

因为这应该同时处理来自不同来源的IThing,所以毫无疑问地引用实现类。

当前解决方案

现在,我正在使用一个ViewModel通过一个具体的实现代理IThing:

public interface IThing {
    string SomeString { get; }
    ObservableCollection<IThing> SomeThings { get; }
    // many more stuff
}

public class IThingViewModel
{
     public IThing Thing { get; }
     public IThingViewModel(IThing it) { this.Thing = it; }
}

<!-- is never applied -->
<HierarchicalDataTemplate DataType="{x:Type local:IThing}">

<!-- is applied, but looks strange -->
<HierarchicalDataTemplate
    DataType="{x:Type local:IThingViewModel}"
    ItemsSource="{Binding Thing.SomeThings}">
    <TextBox Text="{Binding Thing.SomeString}"/>
</HierarchicalDataTemplate>




有没有更好的方法(即没有代理)?

最佳答案

这样做的原因是默认模板选择器仅支持具体类型,而不支持接口。您需要创建一个自定义DataTemplateSelector并将其应用于TreeView的ItemTemplateSelector属性。我找不到在其中找到示例的URL,但是希望有了此信息,您可以对它进行Google搜索。

08-16 23:15