以 MVVM 的方式使用接口在 viewModel 之间进行通信
Communicating between viewModels using interfaces in manner of MVVM
我曾尝试使用 MVVM Light 消息传递在不同的 ViewModel 之间进行通信,但是随着时间的流逝,它变得非常混乱并且很难理解所有消息从何处飞向何处,因此我想询问其他解决方案如何使用接口在 ViewModel 之间进行通信。提供的代码运行良好,但我不确定是否建议以这种方式使用接口。
所以在这里我定义了接口和实现它的class:
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 class 注入到这些树 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) Does this somehow violate MVVM pratice?
没有。 ISelectedProject
基本上是共享服务。共享服务是一种 class,它以解耦的方式为多个组件提供功能。请参阅 this link 了解更多信息和示例。
2) Is it considered a good practice to communicate between viewModels like this?
是的,如果你想让它们彼此分离。
3) Does this solution introduces any risks, for example memory leaks, etc.
使用共享服务本身不会引入任何内存泄漏。但是,如果您的共享服务公开了一个事件,并且视图模型订阅了该事件但未取消订阅,则该服务将使视图模型保持活动状态。
我曾尝试使用 MVVM Light 消息传递在不同的 ViewModel 之间进行通信,但是随着时间的流逝,它变得非常混乱并且很难理解所有消息从何处飞向何处,因此我想询问其他解决方案如何使用接口在 ViewModel 之间进行通信。提供的代码运行良好,但我不确定是否建议以这种方式使用接口。 所以在这里我定义了接口和实现它的class:
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 class 注入到这些树 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) Does this somehow violate MVVM pratice?
没有。 ISelectedProject
基本上是共享服务。共享服务是一种 class,它以解耦的方式为多个组件提供功能。请参阅 this link 了解更多信息和示例。
2) Is it considered a good practice to communicate between viewModels like this?
是的,如果你想让它们彼此分离。
3) Does this solution introduces any risks, for example memory leaks, etc.
使用共享服务本身不会引入任何内存泄漏。但是,如果您的共享服务公开了一个事件,并且视图模型订阅了该事件但未取消订阅,则该服务将使视图模型保持活动状态。