2013-02-28 69 views
1

我想建立一个TreeView这样的:TreeView控件与多种类型

People 
Person 1 
    Relatives 
     Relative 1 
     Relative 2 
    Mom 
    Dad 
    Pets 
     Pet 1 
     Pet 2 

的问题是,一个人有2名列表(亲属和宠物)和两个单品(爸爸妈妈)。我对HierarchicalDataTemplates非常熟悉,但我还没有想出办法做到这一点 - 有很多例子,但似乎没有混合类型。

为了让事情更有趣,可能会有没有妈妈或爸爸的人(悲伤但真实)。该清单需要反映这一点。

我使用的数据源于数据库使用实体框架,所以我的人员列表已经有了正确的结构 - 我不希望所有的对象都来自某个常见的复合对象(也在许多例子),每个人都有一个'名字'和'儿童'。我想使用每个对象的自然属性,例如我的数据模板绑定中的MomsFirstName,PersonsName。

这可能吗?

+0

听起来像你的Person类和与它相关的其他实体在你的Model层。虽然它可以准确地模拟数据库中的数据,但为View准备数据并不一定很容易。我建议使用接口和/或基类将模型转换为具有完整层次结构的ViewModel。 – EtherDragon 2013-02-28 19:57:32

+0

@EtherDragon是。如果数据需要准备,那么我肯定会使用虚拟机。但如果不这样做,我倾向于避免这些类型的虚拟机。但在这种情况下,无论哪种方式,树视图的问题都是一样的。 – Nicros 2013-02-28 21:21:38

回答

0

不知道这是否对您有帮助,但您可以提供自己的模板选择器,为每种类型选择不同的模板;它们都将被您选择的ItemsPanelTemplate对象封装,但它将允许您为指定的任何类型拥有截然不同的控件。这是我的使用情况,但我想你可以应用同样的想法到TreeView

<ItemsControl> 
    <ItemsControl.Resources> 
     <DataTemplate x:Key="templateFoo"> 
     </DataTemplate> 

     <DataTemplate x:Key="templateBar"> 
     </DataTemplate> 

     <DataTemplate x:Key="templateJoe"> 
     </DataTemplate> 
    </ItemsControl.Resources> 

    <ItemsControl.ItemTemplateSelector> 
     <local:MyTemplateSelector></local:MyTemplateSelector> 
    </ItemsControl.ItemTemplateSelector> 

    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Grid/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="Grid.Row" 
       Value="{Binding Row}" /> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 

而这个地方

public class MyTemplateSelector: DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     FrameworkElement element = container as FrameworkElement; 

     if (element == null || item == null) 
      return null; 

     if(item is Foo) 
     { 
      return element.FindResource("templateFoo") as DataTemplate; 
     } 

     if (item is Bar) 
     { 
      return element.FindResource("templateBar") as DataTemplate; 
     } 

     if (item is Joe) 
     { 
      return element.FindResource("templateJeo") as DataTemplate; 
     } 

     return null; 
    } 
} 
+0

您可以使用['DataType'](http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx)属性将其替换为基于类型的数据模板... – 2013-02-28 20:37:58

0

您是否尝试过使用的ItemTemplate和ItemTemplateSelector?