Я пытался использовать легкие сообщения MVVM для связи между разными моделями 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) Считается ли хорошей практикой такое взаимодействие между ViewModels?
3) Вносит ли это решение какие-либо риски, например, утечки памяти и т. Д.?
Спасибо!