我曾尝试使用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)此解决方案是否会带来任何风险,例如内存泄漏等。
谢谢!
答案 0 :(得分:2)
1)这是否违反了MVVM实践?
不。 ISelectedProject
基本上是一项共享服务。共享服务是一个类,它以分离的方式为多个组件提供功能。有关更多信息和示例,请参考this link。
2)这样在viewModel之间进行通信是否被认为是一种好习惯?
是的,如果要使它们彼此分离。
3)此解决方案是否会带来任何风险,例如内存泄漏等。
使用共享服务本身不会引起任何内存泄漏。但是,如果您的共享服务公开了一个事件,并且在不取消订阅的情况下订阅了一个视图模型,则该服务将使该视图模型保持活动状态。