使用HierarchicalDataTemplate显示混合类型

时间:2012-08-19 02:48:44

标签: wpf treeview hierarchicaldatatemplate

我正在尝试使用HierarchicalDataTemplate显示混合类型的树视图,但到目前为止我的所有尝试都失败了..

我有一个类似树的类,可以有两种不同类型的孩子。 (位置和设备)。为了让事情可以理解,我想要展示的是:

->Location 1
    |
    |--->Device 1.1
    |--->Device 1.2
    |--->Location 1.2
          |
          |---->Device 1.2.1 
          |---->Location 1.2.1
            .....etc.....

我尝试过很多我找到的解决方案,但都没有效果。在大多数情况下,我只是在树视图中获取类名。 我正在尝试使用HierarchicalDataTemplate做什么?如果是,请告诉我如何。

4 个答案:

答案 0 :(得分:5)

经过几个小时的反复试验后,我回到了开始并找到了解决方案。我无法相信它实际上是如此简单。

模板如下所示:

<HierarchicalDataTemplate x:Key="NavigatorDataTemplate" DataType="{x:Type local:Location}" ItemsSource="{Binding Locations}">
    <StackPanel>
        <TextBlock Text="{Binding Description}"/>
        <ListBox ItemsSource="{Binding Devices}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Description}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</HierarchicalDataTemplate>

TreeView就是这样:

<TreeView Name="treeNav" ItemTemplate="{StaticResource NavigatorDataTemplate}"/>

由于需要显示的集合已在代码中,我只需将其设置为ItemsSource:

treeNav.ItemsSource = locations;

答案 1 :(得分:1)

HierarchicalDataTemplate应该有助于解决您的问题。查看MSDN Data Templating Overview

上的最新示例

答案 2 :(得分:1)

要使此层次结构工作Location,对象应具有composite collection of Locations and Devices,您只需将该集合设置为HierarchicalDataTemplate的ItemsSource即可。这个样本应该起作用 -

<HierarchicalDataTemplate DataType="{x:Type local:Location}"
                          ItemsSource="{Binding CompositeCollection}">
   <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>

<DataTemplate DataType="{x:Type local:Device}">
   <TextBlock Text="{Binding Name}"/>
</DataTemplate>

我假设您需要在UI上显示的每个对象位置和设备中都有Name属性。将这些数据模板添加到ItemsControl的资源中,这些资源可能是ListBox,TreeView或任何其他ItemsControl。

答案 3 :(得分:0)

作为WPF的新手,我最近解决了同样的问题。我使用的方法是创建一个新类,用于在树中显示数据。

TreeDisplayItem类具有将显示的每个类类型的承包商。 在每个构造函数中,将为传递的类设置_display属性。

itemDef =类别名称

ItemPrice =价格+数量+商店位置

    public class TreeDisplayItem
{
    readonly string _display;
    readonly string _id;
    readonly List<TreeDisplayItem> _items;

    public LegoPriceDisplay(ItemDef itemDef, List<TreeDisplayItem> items)
    {
      ...//Root node class type  ItemDef 
    }

    public LegoPriceDisplay(ItemPrice price)
    {
       ....//child node type = ItemPrice  
    }

    public List<TreeDisplayItem> Items{ get; private set; }


    public string DisplayId 
    { 
        get { return _id; } 
    }


    public string Display
    {
        get { return _display; }
    }


}

在WPF页面XAML中,使用嵌套的HierarchicalDataTemplates定义树视图。 当然,这仅适用于您具有固定/已知树项深度的用例。 在我的例子中,treeview将向下钻取两层(计算根)

 <TreeView Margin="0" Name="TvStorePrices" ItemsSource="{Binding TreeDisplayItemList}">
<TreeView.ItemTemplate>
    <HierarchicalDataTemplate DataType="local:TreeDisplayItem" ItemsSource="{Binding Items}">
     <TextBlock Text="{Binding Display}" />
          <HierarchicalDataTemplate.ItemTemplate>
              <HierarchicalDataTemplate DataType="local:TreeDisplayItem" ItemsSource="{Binding Items}">
                    <TextBlock Text="{Binding Display}" />
              </HierarchicalDataTemplate>
         </HierarchicalDataTemplate.ItemTemplate>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>