【问题标题】:Communicating between viewModels using interfaces in manner of MVVM以 MVVM 的方式使用接口在 viewModel 之间进行通信
【发布时间】:2019-07-11 22:49:44
【问题描述】:

我曾尝试使用 MVVM Light 消息传递在不同的 ViewModel 之间进行通信,但随着时间的推移,它变得非常混乱,很难理解所有消息从哪里飞到哪里,所以我想询问其他解决方案如何在它们之间进行通信使用接口的视图模型。提供的代码运行良好,但我不确定接口是否被修改为以这种方式使用.. 所以在这里我定义了实现它的接口和类:

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 类注入到这些树视图模型中(代码未在此处显示)。 然后在 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) 此解决方案是否会带来任何风险,例如内存泄漏等?

谢谢!

【问题讨论】:

  • 您是否可以与我分享一个通过接口传递消息的工作示例代码?我不能让它工作。

标签: c# wpf mvvm interface service-layer


【解决方案1】:

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

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

2) 像这样在视图模型之间进行通信是否被认为是一种好习惯?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多