C# 从另一个viewmodel访问MainViewModel
我有一个关于虚拟机通信的问题 这是我在C#/WPF应用程序中的代码。在我的主窗口上。xam,我有一个按钮。 单击此按钮, 我需要从另一个ViewModel中访问和修改ProductList集合。 请问我如何做到这一点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
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="..." />