【问题标题】:How to use the wpf treeview with nested objects of different types如何将 wpf 树视图与不同类型的嵌套对象一起使用
【发布时间】:2009-07-31 21:22:06
【问题描述】:

我想在树视图中显示两个类。

在我的主窗口中,我有一个特定类型对象的可观察集合,称为对象 a。 对象 a 包含另一种类型的对象对象 b 的可观察集合。 每个对象 b 都包含一个可观察的对象 b 集合。

例如,我可能有一些看起来像这样的东西

ListOfObjectA 的

-ObjectA1

--ListOfObjectB的

---对象B

----ListOfObjectB的

-----对象B

-ObjectA2

--ListOfObjectB的

---对象B

我的 xaml 应该是什么样子才能将树视图绑定到类似的东西?

对不起,如果我没有很好地解释这一点,我是 wpf 的新手。

【问题讨论】:

    标签: c# wpf treeview


    【解决方案1】:

    RB 的想法是正确的。这就是 WPF 将模板应用于普通 .NET 对象的能力变得非常强大的地方。

    您需要指定两个HierarchicalDataTemplates,一个用于a 类型的对象,另一个用于b 类型的对象。像这样:

    <TreeView>
        <TreeView.Resources>
            <HierarchicalDataTemplate TargetType="{x:Type local:a}">
                <!-- XAML to display objects of type a -->
            </HierarchialDataTemplate>
            <HierarchicalDataTemplate TargetType="{x:Type local:b}">
                <!-- XAML to display objects of type b -->
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>
    

    您需要为每个模板的ItemsSource 属性指定绑定,以便 WPF 知道从哪里获取子对象。此外,您需要向根节点添加 xmlns 声明,指定对象所在的命名空间(在上面的示例代码中由 local 表示)。

    【讨论】:

      【解决方案2】:

      我知道 WPF 真的很危险,但我很确定 HierarchicalDataTemplate 是解决您问题的方法。我的 XAML 技能很差,所以我无法为您编写好的示例代码。这是我在项目中使用 HierarchicalDataTemplate 的方式。我希望这能给你一些好主意。

      <TreeView Grid.Row="1" 
                Grid.Column="1" 
                ItemsSource="{Binding Children}" 
                SelectedItemChanged="TreeView_SelectedItemChanged" 
                ContextMenu="{StaticResource MenuContextMenu}">
      
        <TreeView.ItemTemplate>
          <HierarchicalDataTemplate  ItemsSource="{Binding Children}" >
            <!--<TextBlock Text="{Binding Path=ItemName}" Margin="5,0,5,0" />-->
            <Grid  ContextMenu="{StaticResource ContextMenu}"   >
              <TextBlock  Name="ShownItem" 
                                Text="{Binding Path=ItemName}" 
                                Margin="0,0,0,0" />
      
                <TextBox Name="EditBox" 
                       Text="{Binding Path=ItemName}" 
                       Visibility="{Binding Path=Visibility}"
                       Style="{StaticResource EditableTextBox}" 
                       IsVisibleChanged="EditBox_IsVisibleChanged"
                       PreviewKeyDown="EditBox_KeyDown"
                       Margin="0,2,0,2"
                         >
      
                    </TextBox>
      
            </Grid>
           </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
      </TreeView>
      

      【讨论】:

        猜你喜欢
        • 2021-03-13
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多