如何将网格绑定到用户控件

本文关键字:用户 控件 绑定 网格 | 更新日期: 2023-09-27 18:12:06

我想创建一个类似VLC高级设置菜单的设置菜单:左边是Treeview,右边是某种控件集合。右侧的控件应允许用户操作与树视图中的当前选择相关的设置。我想过在树视图的右侧创建一个网格。然后,根据选择,我对每个需要显示在网格中的视图都有一个用户控件

树视图中的项具有UserControl属性,该属性包含对相关视图的引用。我的视图模型有一个SelectedItem属性,它指示当前选择了树视图中的哪个项目。

现在我想将网格的内容绑定到我的SelectedItemUserControl属性。但我不知道该怎么做。我更喜欢使用基于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都有。