我曾尝试使用MVVM Light消息传递来在不同的ViewModel之间进行通信,但是随着时间的推移它会变得非常混乱并且难以理解所有消息的位置和位置,所以我想询问其他解决方案如何使用Interfaces在ViewModel之间进行通信。提供的代码运行良好,但我不确定Interfaces是否被修改为这样使用..所以在这里我定义了实现它的接口和类:
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类注入到这些树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)这是否会以某种方式违反MVVM的做法?
没有.ISelectedProject
基本上是一个共享服务。共享服务是一个以分离方式为多个组件提供功能的类。有关更多信息和示例,请参阅this link。
2)在这样的viewModel之间进行通信被认为是一种好习惯吗?
是的,如果你想让他们彼此脱钩。
3)此解决方案是否会引入任何风险,例如内存泄漏等。
使用共享服务本身不会引入任何内存泄漏。但是,如果您的共享服务公开了一个事件,并且视图模型会在没有取消订阅的情况下对其进行订阅,则该服务将使视图模型保持活动状态。