Страницы

Поиск по вопросам

четверг, 30 мая 2019 г.

Правильно ли внутри VM хранить UserControl?

У меня есть главная 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 прописываете привязки:

В основном XAML пишете просто

Привязка DataContext по идее произойдёт автоматически.

Вопрос правильности изменения одного VM-объекта другим не регулируется MVVM. Применяйте тот паттерн, который вам кажется более правильным.

Комментариев нет:

Отправить комментарий