1

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

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

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

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

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

这可能吗?

4

2 回答 2

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;
    }
}
于 2013-02-28T20:08:11.167 回答
0

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

于 2013-03-01T10:32:11.563 回答