以 MVVM 的方式使用接口在 viewModel 之间进行通信

Communicating between viewModels using interfaces in manner of MVVM

我曾尝试使用 MVVM Light 消息传递在不同的 ViewModel 之间进行通信,但是随着时间的流逝,它变得非常混乱并且很难理解所有消息从何处飞向何处,因此我想询问其他解决方案如何使用接口在 ViewModel 之间进行通信。提供的代码运行良好,但我不确定是否建议以这种方式使用接口。 所以在这里我定义了接口和实现它的class:

public interface ISelectProject
{
    event EventHandler<SelectedProjectEventArgs> MessageReceived;
    void ProjectSelected(...);       
}

public class SelectProject : ISelectProject
{
    public event EventHandler<SelectedProjectEventArgs> MessageReceived;
    public void ProjectSelected(..)
    {
        MessageReceived?.Invoke(this,new SelectedProjectEventArgs(...));
    }
}

之后,我使用构造函数注入(此处未显示代码)将 SelectProject class 注入到这些树 ViewModel 中。 然后在 ViewModelA 中调用 MessageReceived 事件,所有其他 ViewModel 都订阅该事件。

public class ViewModelA : ViewModelBase
{
    public ViewModelA(ISelectProject selectProject)
    {
        _selectProject = selectProject;
        _selectProject.ProjectSelected;
    }
}

public class ViewModelB : ViewModelBase
{
    public ViewModelB(ISelectProject selectProject)
    {
        _selectProject = selectProject;
        _selectProject.MessageReceived += (s, data) =>
        {
            ...
        };
    }
}

public class ViewModelC : ViewModelBase
{
    public ViewModelC(ISelectProject selectProject)
    {
        _selectProject = selectProject;
        _selectProject.MessageReceived += (s, data) =>
        {
            ...
        };
    }
}

我的问题是:

1) 这是否违反了 MVVM 实践?

2) 像这样在 ViewModel 之间进行通信被认为是一种好的做法吗?

3) 此解决方案是否会引入任何风险,例如内存泄漏等?

谢谢!

1) Does this somehow violate MVVM pratice?

没有。 ISelectedProject 基本上是共享服务。共享服务是一种 class,它以解耦的方式为多个组件提供功能。请参阅 this link 了解更多信息和示例。

2) Is it considered a good practice to communicate between viewModels like this?

是的,如果你想让它们彼此分离。

3) Does this solution introduces any risks, for example memory leaks, etc.

使用共享服务本身不会引入任何内存泄漏。但是,如果您的共享服务公开了一个事件,并且视图模型订阅了该事件但未取消订阅,则该服务将使视图模型保持活动状态。