【问题标题】:How to bind a grid to a user control如何将网格绑定到用户控件
【发布时间】:2013-04-29 08:37:03
【问题描述】:

我想创建一个看起来类似于 VLC 的高级设置菜单的设置菜单:左侧是 Treeview,右侧是某种控件集合。右侧的控件应该使用户能够操作与树视图中的当前选择相关的设置。我考虑过在树视图的右侧创建一个网格。然后我为每个需要在网格中显示的视图都有一个用户控件,基于选择

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      相关资源
      最近更新 更多