ShowDialog RadWindow с MVVMLight - PullRequest
       29

ShowDialog RadWindow с MVVMLight

1 голос
/ 28 июня 2011

У меня есть функциональное приложение 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();

}

1 Ответ

0 голосов
/ 28 июня 2011

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

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

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

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

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

...