У меня есть главная VM которая хранит 2 UserControl и VM-ки к ним. Смена UserControl происходит благодаря свойству CurrentUserControl которое привязывается к вьюшке. Насколько правильно хранить UserControl внутри ViewModel и как лучше это делать со стороны архитектуры MVVM?
Также для смены одного UserControl на другой я в каждую VM-ку передаю ссылку на главную VM и она через эту ссылку их меняет. В правильности этого решения я тоже сомневаюсь.
public class MainVm : VmBase
{
public MainVm()
{
LoginAndRegisterVm = new LoginAndRegisterVm(this);
EnterRegistrationKeyVm = new EnterRegistrationKeyVm(this);
EnterRegistrationKeyUserControl = new EnterRegistrationKey();
EnterRegistrationKeyUserControl.DataContext = EnterRegistrationKeyVm;
LoginUserControl.DataContext = LoginAndRegisterVm;
CurrentUserControl = LoginUserControl;
}
public LoginAndRegisterVm LoginAndRegisterVm { get; set; }
public EnterRegistrationKeyVm EnterRegistrationKeyVm { get; set; }
public UserControl LoginUserControl { get; set; } = new LoginPage();
public UserControl EnterRegistrationKeyUserControl { get; set; }
private UserControl _currentUserControl;
public UserControl CurrentUserControl
{
get { return _currentUserControl; }
set { _currentUserControl = value; NotifyPropertyChanged(); }
}
}
Часть Xaml :
Ответ
С точки зрения MVVM — нет. VM вовсе не должна знать и иметь представление о View, о том, показана ли данная VM в данный момент на экране, и если да, то как и во скольких местах.
Думаю, что правильный паттерн для вашего случая такой:
Вы заводите две вложенные VM: для вашего случая это, судя по всему, LoginAndRegisterVm и EnterRegistrationKeyVm
Заводите в MainVm свойство CurrentPart типа VmBase. В него кладите LoginAndRegisterVm или EnterRegistrationKeyVm, как вам нужно .
Во View прописываете привязки:
Привязка DataContext по идее произойдёт автоматически.
Вопрос правильности изменения одного VM-объекта другим не регулируется MVVM. Применяйте тот паттерн, который вам кажется более правильным.
Комментариев нет:
Отправить комментарий