代码之家  ›  专栏  ›  技术社区  ›  David Schmitt

wpf hierarchicaldatatemplate.datatype:如何对接口作出反应?

  •  3
  • David Schmitt  · 技术社区  · 16 年前

    问题

    我收集了 IThing S和我想创建一个 HierarchicalDataTemplate 对于一个 TreeView . 直截了当的 DataType={x:Type local:IThing} 当然不起作用,可能是因为wpf创建者不想处理可能的歧义。

    因为这应该处理 伊辛 同时,引用实现类是不可能的。

    当前解决方案

    目前,我使用的是一个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>
    

    问题

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

    3 回复  |  直到 12 年前
        1
  •  3
  •   Richard Gavel    16 年前

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

        2
  •  4
  •   Daniel Rose    12 年前

    另一种选择(类似于Jing的解决方案):如果只有一种类型的项,则可以直接设置项模板。那么就不需要设置键或数据类型。

    在视图模型中:

    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>
    
        3
  •  2
  •   jing boxian    15 年前

    另一种解决方案是为HierarchicalDataTemplate提供一个键,并将其放在windows.resources中,然后在TreeView中手动引用它。 <TreeView ItemDataTemplate={StaticResource templateKey}/>

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