如何将网格绑定到用户控件
本文关键字:用户 控件 绑定 网格 | 更新日期: 2023-09-27 18:12:06
我想创建一个类似VLC高级设置菜单的设置菜单:左边是Treeview,右边是某种控件集合。右侧的控件应允许用户操作与树视图中的当前选择相关的设置。我想过在树视图的右侧创建一个网格。然后,根据选择,我对每个需要显示在网格中的视图都有一个用户控件
树视图中的项具有UserControl
属性,该属性包含对相关视图的引用。我的视图模型有一个SelectedItem属性,它指示当前选择了树视图中的哪个项目。
现在我想将网格的内容绑定到我的SelectedItem
的UserControl
属性。但我不知道该怎么做。我更喜欢使用基于XAML的解决方案,而不是清除网格的Children
属性并添加每次SelectedItem
属性更改时要在代码中显示的用户控件。
我建议使用ContentControl
而不是Grid
。
考虑到树视图和内容控件在同一视图模型下:在视图模型上,为与树视图中的项目类型相同的选定项目(我们称之为VMSelectedItem
(添加属性。
在树状图的XAML中添加
SelectedItem="{Binding VMSelectedItem}"
在内容控件的XAML中
Content="{Binding VMSelectedItem.UserControl}"
现在,树中的选择将更新VMSelectedItem
属性,该属性又将更新内容控件的内容。
我建议您使用在资源字典中声明的DataTemplates。您将只使用每个DataTemplate的一个实例,这会留下很好的内存占用。您不需要将视图的实例存储在视图模型中,这是mvvm的基本思想。视图模型完全只包含数据和您希望数据如何显示的信息。
例如,您在视图模型中有一个枚举,其中包含值person、car、tree。在DataTemplateSelector中,您将在该枚举中有一个if,它返回所需的DataTemplate。
基本上,你会把所有东西都放在中心,而不是每个TreeViewItem都有。