ShowDialog в RadWindow с помощью MVVMLight

У меня есть функциональное приложение SL с шаблоном MVVM с RadWindow (по сути, ChildWindow), которое я хотел бы удалить в моем представлении, которое показывает окно с помощью его ShowDialog. И главное представление, и окно привязаны к одной и той же ViewModel, если это помогает.

Кнопка имеет как команду ViewModel, использующую MVVMLight RelayCommand для обработки состояния настройки, так и обработчик событий в представлении.

Окончательное решение / шаблон будет использоваться более 20 раз, так что что-то получше кода программной части было бы замечательно.

Мысли?

private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
    var window = new RadWindowTest.Controls.ChildWindow1();

    window.Closed += new System.EventHandler<Telerik.Windows.Controls.WindowClosedEventArgs>(window_Closed);

    window.ShowDialog();

}

person rusty    schedule 28.06.2011    source источник


Ответы (1)


В этом случае я предлагаю вам реализовать DialogService. Эту услугу вы можете внедрить в свою модель представления, для тестирования вам нужно будет внедрить экземпляр, который не зависит от представления, тем самым сохраняя возможность тестирования. Вы можете использовать ViewModelLocator, чтобы сделать эту службу доступной для вашего приложения.

Другой подход - реализовать класс ViewBase, реализующий интерфейс, позволяющий отображать диалог. Этот интерфейс теперь используется ViewModel для отображения диалогового окна. Опять же, для тестирования вам нужно предоставить другую реализацию интерфейса. Образец можно найти здесь < / а>.

Обе идеи вращаются вокруг одной и той же концепции выделения функции, отображающей диалог. Чтобы строго разделить представление и модель просмотра, вам нужно будет подумать о том, как ViewModel определяет, какой диалог должен быть показан, и как результат диалога или модель диалога возвращаются в вызывающую ViewModel.

Какой подход лучше - решать вам. Лично я предпочитаю первый подход, поскольку мне не нужно наследовать представления от общего базового класса.

PS: Используйте команду, чтобы перейти к той точке в вашей ViewModel, где вы хотите показать диалог. Использование диалоговой службы не требует никакого кода.

person AxelEckenberger    schedule 28.06.2011
comment
Отлично, спасибо. Считаете ли вы, что сообщения MVVMLight также можно использовать или DialogService более чистый (независимый)? - person rusty; 28.06.2011
comment
Очевидно, вы могли бы, но поскольку вы показываете дочернее окно, я считаю, что вызов метода подходит больше. Кроме того, отправка сообщения - это трансляция, в которой вы не знаете, кто может на него отреагировать. Таким образом, вы можете получить несколько всплывающих диалоговых окон, если не будете осторожны. - person AxelEckenberger; 29.06.2011
comment
Я ценю обсуждение, я буду работать над тем, чтобы сделать то, что вы предлагаете. - person rusty; 29.06.2011
comment
Это было прекрасно, я реализовал модифицированный DialogService, он отлично выглядит и работает. Спасибо. - person rusty; 29.06.2011