我想在树视图中显示两个课程。
在我的主窗口中,我有一个可观察的某种类型对象的集合,称之为对象a。 对象a包含另一种类型对象(对象b)的可观察集合。 每个对象b都包含一个可观察对象b的集合。
例如,我可能会看到像这样的东西
ListOfObjectA的
-ObjectA1
- ListOfObjectB的
---对象B
---- ListOfObjectB的
-----对象B
-ObjectA2
- ListOfObjectB的
---对象B
我的xaml应该将树视图绑定到类似的内容?
很抱歉,如果我没有解释清楚,我是wpf的新手。
答案 0 :(得分:6)
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
表示)。
答案 1 :(得分:1)
我知道足够多的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>