3

问题

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

由于这应该同时处理IThing来自不同来源的 s,所以引用实现类是没有问题的。

当前解决方案

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

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>

问题

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

4

3 回答 3

5

另一种选择(类似于jing的解决方案):如果您只有一种类型的项目,您可以直接设置ItemTemplate。然后您不需要设置键或数据类型。

在您的视图模型中:

public ObservableCollection<IThing> Thingies { get; private set; }

在视图中:

<TreeView ItemsSource="{Binding Thingies}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SomeThings}">
            <TextBox Text="{Binding SomeString}" />    
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
于 2012-03-21T11:56:45.307 回答
3

原因是默认模板选择器只支持具体类型,不支持接口。您需要创建一个自定义 DataTemplateSelector 并将其应用于 TreeView 的 ItemTemplateSelector 属性。我找不到找到它的示例的 URL,但希望有了这些信息,你可以谷歌它。

于 2008-12-16T17:02:26.050 回答
2

另一种解决方案是你给 HierarchicalDataTemplate 一个键并将它放在 Windows.Resources 中,然后在 TreeView 中手动引用它。 <TreeView ItemDataTemplate={StaticResource templateKey}/>

但这限制了根据 WPF TreeView 提供的数据类型自动选择数据模板。

于 2010-04-02T08:09:58.157 回答