我想创建一个类似于VLC高级设置菜单的设置菜单:左侧的Treeview和右侧的某种控件集合。右侧的控件应该允许用户操作与树视图中当前选择相关的设置。我想过在树视图右边创建一个网格。然后,我根据选择
为每个需要在网格中显示的视图设置用户控件树视图中的项目具有UserControl
属性,该属性包含对相关视图的引用。我的viewmodel有一个SelectedItem属性,指示当前选择树视图中的哪个项目。
现在我想将网格内容绑定到UserControl
的{{1}}属性。但我无法弄清楚如何做到这一点。我更喜欢使用基于XAML的解决方案,而不是清除网格的SelectedItem
属性,并在每次Children
属性更改时添加我想要在代码中显示的用户控件。
答案 0 :(得分:2)
我建议使用ContentControl
代替Grid
。
考虑树视图和内容控件在同一视图模型下:在视图模型上,为树视图中的项目添加与所选项目(我们称之为VMSelectedItem
)相同类型的属性。 / p>
在树视图的XAML中添加
SelectedItem="{Binding VMSelectedItem}"
在内容控件的XAML中
Content="{Binding VMSelectedItem.UserControl}"
现在树中的选择将更新VMSelectedItem
属性,而后者将更新内容控件的内容。
答案 1 :(得分:0)
我建议你使用你在资源词中声明的DataTemplates。您将只使用每个DataTemplate的一个实例,它留下了很好的内存占用空间。您不需要在viewmodel中存储视图实例,这是mvvm的基本思想。 viewmodel将完全保存数据和信息,以便您希望数据显示。
例如,你的viewmodel中有一个enum,其中包含person,car,tree。在您的DataTemplateSelector中,您将在该枚举上返回if,返回所需的DataTemplate。
基本上你会把所有内容都集中在一起,而不是每个TreeViewItem都有。