C# 以MVVM的方式使用接口在viewModels之间进行通信
我曾尝试使用MVVM Light消息传递在不同的ViewModel之间进行通信,但随着时间的推移,它变得非常混乱,很难理解所有消息从何处传递,因此我想询问其他解决方案,如何使用接口在ViewModel之间进行通信。提供的代码工作得很好,但我不确定是否修改了接口以便以这种方式使用。。 因此,我在这里定义了实现它的接口和类:C# 以MVVM的方式使用接口在viewModels之间进行通信,c#,wpf,mvvm,interface,service-layer,C#,Wpf,Mvvm,Interface,Service Layer,我曾尝试使用MVVM Light消息传递在不同的ViewModel之间进行通信,但随着时间的推移,它变得非常混乱,很难理解所有消息从何处传递,因此我想询问其他解决方案,如何使用接口在ViewModel之间进行通信。提供的代码工作得很好,但我不确定是否修改了接口以便以这种方式使用。。 因此,我在这里定义了实现它的接口和类: public interface ISelectProject { event EventHandler<SelectedProjectEventArgs>
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(...));
}
}
我的问题是:
1) 这是否违反了MVVM实践
2) 这样在视图模型之间进行通信是否被认为是一种良好的做法
3) 此解决方案是否会带来任何风险,例如内存泄漏等
谢谢大家!
1) 这是否违反了MVVM实践
否。ISelectedProject
基本上是一项共享服务。共享服务是一个类,它以解耦的方式为多个组件提供功能。有关更多信息和示例,请参阅
2) 这样在视图模型之间进行通信是否被认为是一种良好的做法
是的,如果你想让它们彼此分离
3) 此解决方案是否会带来任何风险,例如内存泄漏等
使用共享服务本身不会导致任何内存泄漏。但是,如果您的共享服务公开了一个事件,并且视图模型在未取消订阅的情况下对此事件进行了订阅,则该服务将使视图模型保持活动状态。您是否可以与我共享一个用于通过接口传递消息的工作示例代码?我不能让它工作。
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) =>
{
...
};
}
}