Как инициализировать модель представления со свойствами из другого представления Модель - PullRequest
0 голосов
/ 23 сентября 2019

Мой вопрос заключается в том, каков идеальный способ инициализации дочернего окна в WPF, MVVM?

У меня есть окно WPF, давайте назовем его ParentWindow с его классом представления модели - ParentWindowViewModel.При нажатии кнопки в пользовательском интерфейсе ParentWindow я запускаю новое окно WPF - ChildWindow, как показано ниже

ChildWindow  r = new ChildWindow ();
 r.ShowDialog();           
 r.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Теперь у ChildWindow есть свой собственный viewModel, такой как - ChildWindowViewModel.Дочернее окно имеет текст данных, установленный в его xaml как

<Window.DataContext>
        <viewModel:ChildWindowViewModel/>
    </Window.DataContext>

При нажатии кнопки в ParentWindow, когда я запускаю дочернее окно, мне нужно передать определенные значения в дочернее окно, которое будет использоватьсяинициализировать дочернее окно.Без этих значений дочернее окно не может быть инициализировано. Каждый раз, когда я нажимаю кнопку, чтобы запустить дочернее окно, значения, передаваемые в дочернее окно, будут различаться в зависимости от некоторых других выбранных элементов в родительском окне.

1 Ответ

1 голос
/ 23 сентября 2019

Я бы сделал что-то вроде этого (без проверки ошибок):

в ParentWindow.xaml.cs

private void Some_Event_In_Parent_Window()
{
   ParentWindowViewModel pvm = DataContext as ParentWindowViewModel;
   ChildWindow cw = new ChildWindow(pvm.Element1, pvm.Element2);
}

int ChildWindow.xaml.cs

public ChildWindow(bool elem1, string elem2)
{
   InitializeComponents();
   DataContext = new ChildWindowViewModel(elem1, elem2);
} 

Если вы имеете дело с минимальными элементами, которые должны быть перенесены между окнами / виртуальными машинами, и речь идет в основном об отправке какой-либо формы «состояния» или «значения», то при инициализации Viewmodel в коде не возникает особых проблем.Помните, что <viewmodel:ChildWindowViewModel/> эквивалентно DataContext = new ChildWindowViewModel() в вашем коде.Хотя да, вы можете создавать спагетти-код или вводить в заблуждение зависимости, не придерживаясь шаблонов;Вы можете также перепроектировать чушь чего-то, что не требовало усилий и может быть столь же запутывающим.

Я обнаружил, что есть навязчивая идея сохранить ваш код пустым (у меня такая же навязчивая идея).Помните, что Кодекс существует по какой-то причине, и вы МОЖЕТЕ его использовать.Иногда не стоит чрезмерно усложнять вашу кодовую базу путем реализации какого-то большого шаблона, если у вас есть единственное требование, которое может быть обработано в коде с некоторыми добавленными комментариями.

Помимо обработчиков событий, я использую код для следующих основных случаев использования:

  1. Для пользовательского интерфейса необходима слишком сложная настройка, чтобы обрабатывать ее только в XAML.Пример: мне нужна странная конкатенация строк и логика некоторых вводимых текстовых полей.
  2. Существует некоторое минимальное состояние или данные, которые необходимо передать между представлениями.(Как и ваше требование)
  3. Должна произойти какая-то логика, специфичная для пользовательского интерфейса и не связанная с базовыми данными или ViewModel.(Это редко, и почти всегда маленький).

В терминах "это идеал" для MVVM;это зависит от вашего определения идеала.

  • Может ли это быть обработано другим шаблоном дизайна?Вероятно...?Но стоит ли это того.
  • Добавляет ли реализация указанного шаблона раздувание или накладные расходы, которые решают только небольшую проблему?Может быть.Это вам решать.
  • Собираетесь ли вы повторить эту реализацию более одного раза?Если так, у вас может быть плохой дизайн, чтобы переосмыслить
  • Решает ли реализация этого решения с использованием кода позади быстрое решение вашей проблемы, которое можно поддерживать и читать в меру?Если так, то я не вижу проблемы.

Идеал не всегда определяется правилами.Это также зависит от ваших потребностей и требований.

Не всегда легко определить, где должен использоваться ваш вариант использования.View, ViewModel, может быть, Service или класс состояний Singleton.Если ваш вариант использования это одно окно, код в порядке (по моему мнению).Если вы делаете это для 20 окон, вы можете захотеть, чтобы Служба как-то поддерживала состояние.Подумайте об этом больше - если ваш код SOLID и DRY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...