问题
我有一个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搜索。