【问题标题】:How to bind one viewmodel to a datagrid and another viewmodel to one of its column's property如何将一个视图模型绑定到数据网格,将另一个视图模型绑定到其列的属性之一
【发布时间】:2014-01-17 07:16:21
【问题描述】:

我有一个带有 DataGrid 的 View1,并设置了 View1.DataContext = ViewModel1。 ViewModel1 有一个ObservableCollection<Dto>,我已将它绑定到DataGrid 的ItemSource。 现在,我有另一个带有一组复选框的 View2 和一个 ViewModel2 作为它的 DataContext。 我必须根据 ViewModel2 属性在 View1 中的 DataGrid 中设置列​​的可见性。我是 WPF 新手,不知道这是否正确以及如何实现。

【问题讨论】:

    标签: c# wpf xaml mvvm datagrid


    【解决方案1】:

    顾名思义,ViewModel 应该包含显示视图所需的所有数据。您应该将 ViewModel2 的可见性标志作为属性放在 ViewModel1 中,以便显示 View1 所需的所有信息都存在于 ViewModel1 中。

    遵循此路径,您的代码将更易于维护,并且无需任何特殊处理即可使用 View1.DataContext 的默认行为。如果您的 ViewModel1 依赖于 ViewModel2,那么您的 View1 也依赖于 ViewModel2。如果您只有 2 个 ViewModel,这可能不是问题。但是,随着您的应用程序增长,您将拥有更多的 ViewModel,如果您继续相互依赖,您的应用程序将在很短的时间内无法维护。

    【讨论】:

    • 我的理解是每个视图都应该有自己的视图模型,这样视图 2 应该有自己的视图模型,其中包含绑定到其视图中控件的属性。但是,我需要一种将 ViewModel2 用于 View1 的方法。
    • 据我了解您的问题,您需要一种方法来设置 View1 的 DataGrid 中的可见性。即使值来自 ViewModel2,该标志也会出现在 ViewModel1 中。您的 ViewModel2 保持原样并在 View2 中使用。
    【解决方案2】:

    您可以在 ViewModel1 中公开您的 ViewModel2,这是一个示例

    public class ViewModel1
    {
       public ViewModel2 {get;set;}
       public ViewModel1()
       {
          this.ViewModel2 = new ViewModel2(); //or you can send  ViewModel2 instance as a parameter
       }
    } 
    

    现在您可以将DataContext 设置如下

    1. 将 View1 DataContext 设置为 ViewModel1
    2. 将 View2 DataContext 设置为 ViewModel1.ViewModel2
    3. 在您的 View2 中,您可以像现在一样绑定复选框 现在
    4. 在您的 View1 中,您绑定了列的可见性,例如 {Binding ViewModel2.someproperty}

    如果 ViewModel 需要了解彼此的信息,您需要考虑以下其中一项

    • 子视图模型
    • 使用 EventAggregator。
    • 拥有一个包含需要了解的 ViewModel 的 ViewModel 关于彼此的事情以及处理他们必须对 PropertyChanged 事件做出反应的事情
    • 或简单地制作一个包含所有属性的 ViewModel,以及 您将 View1 和 View2 的 DataContext 设置为该 ViewModel

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2010-12-02
      • 2015-12-22
      相关资源
      最近更新 更多