C# WPF:MVVM上的windows之间的通信

C# WPF:MVVM上的windows之间的通信,c#,wpf,mvvm,C#,Wpf,Mvvm,我很难理解如何让多个窗口使用MVVM模式相互通信 我有我的父母窗口p和两个孩子叫C1和C2。我想要实现的是,当C1更改了P的公共属性时,P会收到通知,并将其传达给C2 我不想使用公共ViewModel,因为我想找到一个可以轻松缩放的解决方案,甚至不想强制C1使用相同的字段名p和C2 这将应用于可插拔工具包,在该工具包中,我或其他人可以创建新组件的程序集(例如窗口),并在主窗口或其他组件更改公共元素时订阅通知 有没有我缺少的某种模式?我会使用棱镜来实现这一点 以下是一个例子: 将引发事件的类: p

我很难理解如何让多个窗口使用MVVM模式相互通信

我有我的父母窗口p和两个孩子叫C1和C2。我想要实现的是,当C1更改了P的公共属性时,P会收到通知,并将其传达给C2

我不想使用公共ViewModel,因为我想找到一个可以轻松缩放的解决方案,甚至不想强制C1使用相同的字段名p和C2

这将应用于可插拔工具包,在该工具包中,我或其他人可以创建新组件的程序集(例如窗口),并在主窗口或其他组件更改公共元素时订阅通知


有没有我缺少的某种模式?

我会使用棱镜来实现这一点

以下是一个例子:

将引发事件的类:

public class MainViewModel
{
    public void UpdateName(string name)
    {
        Utility.EventAggregator.GetEvent<UpdateNameEvent>().Publish(name);
    }
}
public class Child1ViewModel
{
    public string Name { get; set; }

    public Child1ViewModel()
    {
        Utility.EventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);
    }

    private void UpdateName(string name)
    {
        this.Name = name;
    }
}
public class Utility
{
    public static EventAggregator EventAggregator { get; set; }

    static Utility()
    {
        EventAggregator = new EventAggregator();
    }
}
public class UpdateNameEvent : PubSubEvent<string>
{
}
static void Main(string[] args)
{
    MainViewModel mainViewModel = new MainViewModel();
    Child1ViewModel child1 = new Child1ViewModel();
    Child2ViewModel child2 = new Child2ViewModel();
    mainViewModel.UpdateName("Name1");

    Console.WriteLine(child1.Name);
    Console.WriteLine(child2.Name);
}
事件的定义如下:

public class MainViewModel
{
    public void UpdateName(string name)
    {
        Utility.EventAggregator.GetEvent<UpdateNameEvent>().Publish(name);
    }
}
public class Child1ViewModel
{
    public string Name { get; set; }

    public Child1ViewModel()
    {
        Utility.EventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);
    }

    private void UpdateName(string name)
    {
        this.Name = name;
    }
}
public class Utility
{
    public static EventAggregator EventAggregator { get; set; }

    static Utility()
    {
        EventAggregator = new EventAggregator();
    }
}
public class UpdateNameEvent : PubSubEvent<string>
{
}
static void Main(string[] args)
{
    MainViewModel mainViewModel = new MainViewModel();
    Child1ViewModel child1 = new Child1ViewModel();
    Child2ViewModel child2 = new Child2ViewModel();
    mainViewModel.UpdateName("Name1");

    Console.WriteLine(child1.Name);
    Console.WriteLine(child2.Name);
}
对于这个例子,我使用的是一个控制台应用程序。要加快速度,请输入一个字符串参数,但您可以根据需要替换它。 无论是MVVM方法还是任何其他模式,您都可以轻松实现这种通信

在Nuget的帮助下安装Prism.Core,您将获得对Prism dll的引用

再次:MainViewModel将发布事件,并且两个子项都将订阅该事件

就这样

有没有什么模式是我遗漏的

对。您可以使用Prism中的
EventAggregator
或MvvmLight中的
Messenger
类以松散耦合的方式将消息从一个窗口发送到另一个窗口。有关该概念的更多信息,请参阅以下链接


每个窗口只知道一个事件聚合器或messenger。windows互不了解或互不依赖。

大多数MVVM框架提供了一条消息总线,可将发布者与订阅者分离。您可以查看
EventAggregator
功能。您是否使用任何MVVM框架,如Prism、MVVMLight或Caliburn Micro?除了.NET普通框架之外,我没有使用任何MVVM框架。您可以尝试Redux设计模式。感谢您提供的扩展示例。不幸的是,这并不能解决我的问题。MainViewModel(P)可以将更改通知C1和C2,但C1不能通知P和C2,C2也不能通知P和C1。当然,订阅P会导致无限递归循环,从而导致StackOverflowException。这只是一个处理发布和订阅的问题。你可以很容易地选择你班级的所有职责。我刚才提到了机制,但具体的逻辑取决于你。