Ссылка Представления MVVM на ViewModel

Я использую MVVM в приложении WPF. Я очень плохо знаком с обоими. Позвольте мне заявить, что я не самое чистое в шаблоне MVVM, я пытаюсь использовать столько лучших практик, сколько я могу, но пытаться сделать то, что я думаю, разумные компромиссы, чтобы заставить его работать в нашей среде. Например, я не пытаюсь достигнуть 0%-го кода, по моему мнению, codebehind.

У меня есть несколько вопросов о лучших практиках.

1) Я понимаю, что не хочу, чтобы мой VM знал о приложенном Представлении, но действительно ли разумно для Представления иметь ссылку на свой VM?

2) Если управление в Представлении открывает другое Представление (такое как диалоговое окно), я должен обработать это в Представлении? Кажется неправильным обработать его в VM с тех пор, VM имеет некоторое знание определенного Представления.

12
задан BrettRobi 29 March 2010 в 16:30
поделиться

4 ответа

1) Представление определенно имеет ссылку на ViewModel через DataContext. И вам разрешено преобразовывать DataContext в ваше представление:

public class ShellView : Window 
{
   …
   public ShellViewModel { get { return DataContext as ShellViewModel; } }

Это не нарушение паттерна Model-View-ViewModel.

.

2) Вы правы. ViewModel не должен открывать другое представление. Лучше использовать контроллеры. Они несут ответственность за рабочий процесс приложения.

Если вас интересует более подробная информация, вы можете ознакомиться с WPF Application Framework (WAF) .

13
ответ дан 2 December 2019 в 07:20
поделиться

1). Представлению потребуется ссылка на модель представления на некотором уровне, поскольку модель представления будет действовать как текст данных представления.

2) Один из способов справиться с этим - иметь обобщенную модель представления, представляющую диалог, который принадлежит основной модели представления (той, которая используется в качестве текста представления данных).

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

2
ответ дан 2 December 2019 в 07:20
поделиться

1) Вот два простых способа, как View "знает" ViewModel. Представлению разумно знать о ViewModel (для привязки данных), но в вашем случае это может не понадобиться. Посмотрите, поможет ли какой-либо из этих подходов решить вашу проблему. Есть и другие способы, но они должны быть достаточно простыми:

public View(ViewModel vm)
{
     View.DataContext = vm;
}

public Bootstrapper(View v, ViewModel vm)
{
     v.DataContext = vm;
     //or, if you want it to have no parameters
     View v = new View();
     ViewModel vm = new ViewModel();
     v.DataContext = vm;
}

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

2.) Этот вопрос может быть неприятным моментом при проектировании MVVM. Если мы говорим об общем Win32 MessageBox, я часто разделяю эту логику на дополнительный объект и помещаю его в виртуальную машину. Этот способ имеет тенденцию к большей ясности. (Например, я выбрал элемент в ListBox, я прикрепил команду Delete ICommand к этому действию, и в моей ViewModel, когда эта ICommand будет выполнена, я буду ткнуть свой объект MessageBoxObject, чтобы спросить, "действительно ли пользователь хочет удалить" это элемент). Более продвинутые «Диалоги» будут использовать дополнительные ViewModels и DataTemplates для этих ViewModels. Я предпочитаю подход Посредник .

3
ответ дан 2 December 2019 в 07:20
поделиться

Создайте свою собственную платформу MVVM

Мне очень интересен подход, предложенный Робом Айзенбергом.

Ключевые моменты:

  1. Соглашение о конфигурации
  2. Сначала ViewModel

Что очень похоже на философию ASP.NET MVC.

Очень рекомендую посмотреть видео.

1
ответ дан 2 December 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: