TreeView有多种类型

时间:2013-02-28 19:43:21

标签: wpf treeview

我想构建一个这样的树视图:

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

问题是一个人有2个名单(亲戚和宠物)和两个单项(妈妈和爸爸)。我对HierarchicalDataTemplates非常熟悉,但我还没有找到一种方法来做到这一点 - 那里有很多例子,但似乎没有像这样混合类型。

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

使用的数据源自使用实体框架的数据库,因此我的人员列表已经具有正确的结构 - 我宁愿不让所有对象派生自一些常见的复合对象(在许多示例中也是如此) )每个人都有'姓名'和'儿童'。我想在我的datatemplates的绑定中使用每个对象的自然属性,如MomsFirstName,PersonsName。

这可能吗?

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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