【问题标题】:How to bind a grid to a user control如何将网格绑定到用户控件
【发布时间】:2013-04-29 08:37:03
【问题描述】:
我想创建一个看起来类似于 VLC 的高级设置菜单的设置菜单:左侧是 Treeview,右侧是某种控件集合。右侧的控件应该使用户能够操作与树视图中的当前选择相关的设置。我考虑过在树视图的右侧创建一个网格。然后我为每个需要在网格中显示的视图都有一个用户控件,基于选择
树视图中的项目有一个UserControl 属性,它包含对相关视图的引用。我的视图模型有一个 SelectedItem 属性,该属性指示当前选择了树视图中的哪个项目。
现在我想将网格的内容绑定到我的SelectedItem 的UserControl 属性。但我不知道该怎么做。我宁愿使用基于 XAML 的解决方案,而不是清除网格的 Children 属性并添加我希望在每次 SelectedItem 属性更改时在代码中显示的用户控件。
【问题讨论】:
标签:
c#
wpf
data-binding
user-controls
grid
【解决方案1】:
我建议使用ContentControl 而不是Grid。
考虑到树视图和内容控件在同一个视图模型下:在您的视图模型上,为与树视图中的项目类型相同的选定项目(我们称之为VMSelectedItem)添加属性。
在树视图的 XAML 中添加
SelectedItem="{Binding VMSelectedItem}"
在内容控件的 XAML 中
Content="{Binding VMSelectedItem.UserControl}"
现在树中的选择将更新VMSelectedItem 属性,而该属性又会更新内容控件的内容。
【解决方案2】:
我建议您使用您在资源字典中声明的 DataTemplates。您将只使用每个 DataTemplate 的一个实例,这会留下很好的内存占用。您不需要在视图模型中存储视图实例,这是 mvvm 的基本思想。视图模型将完全只保存数据和您希望数据如何显示的信息。
例如,您的视图模型中有一个枚举,其值为 person、car、tree。在您的 DataTemplateSelector 中,您将在该枚举上有一个 if,它返回所需的 DataTemplate。
基本上,您将拥有所有内容,而不是每个 TreeViewItem 拥有所有内容。