【发布时间】: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