Должен ли ваш ViewModel предоставлять элементы XAML как свойства или нет?

По вопросу Stackru Как можно использовать конвертеры WPF в шаблоне MVVM? Я узнал, что преобразователи значений не должны использоваться в шаблоне MVVM, поскольку функциональность преобразователя значений должна обрабатываться самой ViewModel.

Это имеет смысл.

Но я помню, что читал, что вы не должны открывать элементы XAML для представления, а вместо этого предоставлять только наборы данных, которые затем привязывает и отображает представление с использованием DataTemplates.

Однако конвертеры кажутся достаточно мощными (например, поскольку они используются в демонстрационной версии шаблона MVVM, см. "Образец Messenger" после распаковки), в том, что они могут преобразовывать объекты в объекты, например объекты Message в объекты FlowDocument или объекты Customer в объекты Visibility. или пользовательские объекты статуса в изображения и т. д.

Так что, если ViewModel собирается взять на себя функциональность преобразователя значений, ему придется предоставить элементы и свойства XAML, такие как StackPanel, Visibility, Color, FlowDocument и т. Д., Верно?

Кто-нибудь видит какую-либо причину, почему ViewModel не должен предоставлять эти богатые XAML-объекты, как это делают конвертеры значений?

5 ответов

Решение

Потому что тогда это ограничивает ViewModel для использования только с определенным визуальным представлением. Если у вас есть модель ViewModel, испускающая XAML, она помещает содержимое проекта в домен разработчика. Это означает, что дизайнер, использующий Expression Blend, не может редактировать ресурсы проекта - и рабочий процесс дизайнера / разработчика нарушен. Сохранение XAML на странице и использование преобразователей значений с шаблонизацией данных позволяет отделить дизайн от кода.

Когда ваша ViewModel предоставляет конкретный XAML, он также ограничивает использование этой ViewModel только в этом конкретном экземпляре и делает его менее пригодным для повторного использования.

Не забывайте, что вы можете использовать DataTemplates тоже. Я вижу некоторый смысл в том, чтобы удерживать ValueConverters от MVVM, но DataTemplates все о преобразовании объектов в GUI.

Ваша ViewModel может предоставлять другие объекты (например, вложенные ViewModels) в GUI, и GUI может использовать <DataTemplate DataType="{x:Type SubViewModel}">... отобразить эти объекты в графический интерфейс.

Кто-нибудь видит какую-либо причину, почему ViewModel не должен предоставлять эти богатые XAML-объекты, как это делают конвертеры значений?

Абсолютно, потому что это подрывает все цели MVVM:

  1. Вы больше не тестируете модуль, по крайней мере, не легко.
  2. У вас больше нет разделения между логикой (модель представления) и представлением (представление). Таким образом, дизайнеры и разработчики не могут легко сотрудничать.
  3. Ведение кода сложнее, потому что вы смешали проблемы вместе.

Если бы я увидел модель представления, возвращающую представление, я бы даже не классифицировал ее как MVVM.

Я думаю, что одна идея mvvm/mvc/mvp и т. Д. Состоит в том, чтобы изолировать код GUI в один файл / класс. Если вы сделаете это, вы можете перейти на какой-то другой интерфейс, не переписывая другие объекты? Я думаю, что если вы передаете конкретные объекты WPF, ответ будет отрицательным. Это ценностное суждение, которое вы должны сделать для себя.

Не существует абсолютного правила 100%, которое работает для этой или многих других концепций, когда вы обсуждаете их без учета того, почему мнение сообщества изменилось так же, как и в этом направлении. В "общепринятой мудрости" нет "предполагаемой" истины или науки, независимо от того, насколько она нова или неотразима в то время.

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

Другие вопросы по тегам