如何将一个viewmodel绑定到datagrid,将另一个viewmodel绑定到其列的属性之一

时间:2013-12-30 11:48:58

标签: c# wpf xaml mvvm datagrid

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以在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. 可以像你一样对复选框进行绑定 现在
  5. 您在View1中
  6. 绑定了{Binding ViewModel2.someproperty}
  7. 等列的可见性

    如果ViewModels需要了解彼此之间的事情,则需要考虑以下其中一项

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