从另一个视图模型访问MainViewModel

时间:2016-11-15 10:43:25

标签: c# wpf mvvm

我对VM通信有疑问。

这是我在C#/ WPF应用程序中的代码。在我的MainWindow.xam上,我有一个按钮。 点击此按钮, 我需要从另一个ViewModel中访问和修改ProductList集合。 我该如何做到这一点?

public List<ProductInfo> ProductList { get; private set; }

private MainWindow m_mvWindow = null;

public MainWindowViewModel(MainWindow window)
{
    this.m_mvWindow = window;
}

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MainWindowViewModel(this); 
    }
}

感谢。

2 个答案:

答案 0 :(得分:2)

最简单的解决方案是将您的其他VM作为MainWindowViewModel的属性公开,向子VM传递对ProductList集合的引用,并在子VM上绑定一个ICommand,该ICommand绑定到XAML中的按钮并处理集合修改。

这样的事情:

主虚拟机

public class MainViewModel
{
   <!-- Your stuff ->
   public ChildViewModel ChildViewModel
   {
      if(_childViewModel == null)
      { 
         _childViewModel = new ChildViewModel(ProductList)
      }
      return _childViewModel;         
   }
}

子VM

public class ChildViewModel
{
   private List<ProductInfo> _products;

   public DelegateCommand ClearCollection {get; set;}

   public ChildViewModel(List<ProductInfo> products)
   { 
      _products = products;
      ClearCollection = new DelegateCommand(OnClearCollection);
   }

   private void OnClearCollection()
   {
      _products.Clear();
   }
}

在xaml ......

<Button Command={Binding ChildViewModel.ClearCommand} Content="..." />

答案 1 :(得分:0)

您可以使用以下任一方式:

  1. 在其他视图模型中创建一个事件,并在主视图模型中处理它。这将是首选方式,因为它确实避免将您的子VM耦合到主VM,这是糟糕的设计。
  2. 将集合传递给构造函数中的子VM。尽量避免传递完整的主VM,以避免耦合。