C# 从另一个viewmodel访问MainViewModel

C# 从另一个viewmodel访问MainViewModel,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个关于虚拟机通信的问题 这是我在C#/WPF应用程序中的代码。在我的主窗口上。xam,我有一个按钮。 单击此按钮, 我需要从另一个ViewModel中访问和修改ProductList集合。 请问我如何做到这一点 public List<ProductInfo> ProductList { get; private set; } private MainWindow m_mvWindow = null; public MainWindowViewModel(MainWindo

我有一个关于虚拟机通信的问题

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

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

private MainWindow m_mvWindow = null;

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

谢谢。

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

大概是这样的:

主虚拟机

public class MainViewModel
{
   <!-- Your stuff ->
   public ChildViewModel ChildViewModel
   {
      if(_childViewModel == null)
      { 
         _childViewModel = new ChildViewModel(ProductList)
      }
      return _childViewModel;         
   }
}
public类主视图模型
{

最简单的解决方案是将其他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;         
   }
}
public类主视图模型
{

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

  • 在另一个视图模型中创建一个事件,并在主视图模型中处理它。这是首选方法,因为它确实避免了将子VM耦合到主VM,这是一种糟糕的设计
  • 将集合传递给构造函数中的子VM。再次尝试避免传递完整的主VM以避免耦合

  • 您可以使用以下任一方法:

  • 在另一个视图模型中创建一个事件,并在主视图模型中处理它。这是首选方法,因为它确实避免了将子VM耦合到主VM,这是一种糟糕的设计
  • 将集合传递给构造函数中的子VM。再次尝试避免传递完整的主VM以避免耦合

  • 您使用的是MVVM框架吗?我使用MVVM Light,对于此类问题,我将使用Messenger类(中介模式的实现)。“其他”VM将订阅消息,MainViewModel将(在处理按钮单击的命令中)发送消息。您为什么要这样做?如果您的
    main窗口
    有一个按钮,该按钮将从您的
    main窗口视图模型
    触发一个
    ICommand
    ,该按钮可能会通过服务修改数据。如果数据也显示在另一个视图中,则该视图和
    main窗口
    也应显示从一个公共源获取他们的数据,该源应该通知他们更新。你真的不需要将视图模型或命令传递给其他视图模型或命令,它们就在视图中。你使用的是MVVM框架吗?我使用MVVM Light,对于这样的问题,我会使用Messenger类(中介模式的实现)。“其他”VM将订阅一条消息,MainViewModel将(在处理按钮单击的命令中)发送消息。您为什么要这样做?如果您的
    main窗口
    有一个按钮,该按钮将从您的
    main窗口视图模型
    触发一个
    ICommand
    ,该按钮可能会通过服务修改数据。如果数据也显示在另一个视图中,则该视图和
    main窗口
    也应显示从一个公共源获取他们的数据,该源应该通知他们更新。你真的不需要将视图模型或命令传递给其他视图模型或命令,它们是为视图而存在的。也许我错了(我对WPF很陌生)但这似乎是一个实现有限的想法。我正在构建一个应用程序,它有15个视图需要耦合到MainWindowViewModel。这似乎不对。本质上不需要公开ChildViewModel属性。您可以使用MainViewModel.Clear命令将调用封送到子级ViewModel本身。@Jay在你的例子中,我会研究Prisms EventAggregator,寻找一种更适合多个viewmodels的完全解耦方法。也许我错了(我对WPF非常陌生)但这似乎是一个实现有限的想法。我正在构建一个应用程序,它有15个视图需要耦合到MainWindowViewModel。这似乎不对。本质上不需要公开ChildViewModel属性。您可以使用MainViewModel.Clear命令将调用封送到子级ViewModel本身。@Jay在您的例子中,我将研究Prisms EventAggregator,寻找一种更适合多个viewmodels的完全解耦方法。
    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();
       }
    }
    
    <Button Command={Binding ChildViewModel.ClearCommand} Content="..." />