题
我有一个 TreeView
,它有三个级别。
让我们说它是一个联盟,分区和团队 TreeView
。
现在,当我选择树中的每个项目时,我希望看到有关它的详细信息。
实现这一目标的最佳途径是什么?
由于 Grid
不是项目(比如 ListBox
),我不能只设置它的 ItemsSource
并创建一个的DataTemplate 代码> ...
我考虑使用 ListBox
,它只包含所选项目,但这似乎非常糟糕......
感谢。
解决方案
首先为你的联赛,分区和团队类定义3 DataTemplate
。之后,将 TreeView
绑定到对象的根目录。您的League和Division类应该有一个返回子项的Children属性。你的所有类都应该有一个Name属性。
然后,当您想要显示单个对象时,使用 ContentPresenter
,并将其内容绑定到 SelectedItem
(如果 TreeView
)。
例如:
<StackPanel>
<StackPanel.Resources>
<DataTemplate DataType="{x:Type your_namespace:League}">
<StackPanel Orientation="Vertical">
<TextBlock Text={Binding Name}/>
<.../>
<StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type your_namespace:Division}">
<StackPanel Orientation="Vertical">
<TextBlock Text={Binding Name}/>
<.../>
<StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type your_namespace:Team}">
<StackPanel Orientation="Vertical">
<TextBlock Text={Binding Name}/>
<.../>
<StackPanel>
</DataTemplate>
</StackPanel.Resources>
<TreeView x:Name="_tree" ItemsSource="{Binding RootOfYourItems}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text={Binding Name}/>
</HierarchicalDataTemplate>
</TreeView>
<ContentPresenter Content="{Binding Path=SelectedItem, ElementName=_tree}" />
</StackPanel>
此代码未经过测试或编译,仅作为示例提供。
其他提示
我会创建一个viewmodel,其中包含树结构的属性,当前选择以及当前选择的详细信息。
树结构是单向绑定到树视图,树视图中的SelectedItem是绑定到当前选择属性的OneWayToSource(由于属性的限制)。一旦当前选择发生更改,此属性将更改子项列表,并且子项将绑定到显示它们的列表框。
不隶属于 StackOverflow