使用接口通过MVVM在viewModel之间进行通信

时间:2019-02-18 14:16:11

标签: c# wpf mvvm interface service-layer

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

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类注入这些树viewModels中。 然后在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 个答案:

答案 0 :(得分:2)

  

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

不。 ISelectedProject基本上是一项共享服务。共享服务是一个类,它以分离的方式为多个组件提供功能。有关更多信息和示例,请参考this link

  

2)这样在viewModel之间进行通信是否被认为是一种好习惯?

是的,如果要使它们彼此分离。

  

3)此解决方案是否会带来任何风险,例如内存泄漏等。

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