Страницы

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

воскресенье, 8 марта 2020 г.

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

#c_sharp #net #wpf #mvvm


У меня есть главная 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 :



    


Ответы

Ответ 1



С точки зрения MVVM — нет. VM вовсе не должна знать и иметь представление о View, о том, показана ли данная VM в данный момент на экране, и если да, то как и во скольких местах. Думаю, что правильный паттерн для вашего случая такой: Вы заводите две вложенные VM: для вашего случая это, судя по всему, LoginAndRegisterVm и EnterRegistrationKeyVm. Заводите в MainVm свойство CurrentPart типа VmBase. В него кладите LoginAndRegisterVm или EnterRegistrationKeyVm, как вам нужно . Во View прописываете привязки: В основном XAML пишете просто Привязка DataContext по идее произойдёт автоматически. Вопрос правильности изменения одного VM-объекта другим не регулируется MVVM. Применяйте тот паттерн, который вам кажется более правильным.

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

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