У меня есть несколько вопросов о шаблоне MVVM - PullRequest
3 голосов
/ 15 июня 2009

Меня зовут Хесус из Испании, я являюсь разработчиком .NET, и я только что открыл эту замечательную сеть несколько дней назад.

У меня есть несколько вопросов о шаблоне MVVM, и я буду рад, если вы сможете на них ответить.
Я начал использовать WPF три месяца назад и изучил шаблон MVP.
MVP настолько хорош, что вы можете так хорошо структурировать приложение.

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

Сейчас я сосредоточен на реализациях, использующих инструментарий MVVM в CodePlex, но у меня есть вопросы, и я не могу найти слишком много информации.

Я думаю, что MVVM - это вариация MVP.
С MVP у каждого представления есть презентатор, который выполняет работу представления.
В MVVM это то же самое, но с помощью команд, когда вы можете.

Я также видел, что если вам нужно событие, это похоже на MVP; делегирование события ведущему / View-Model, то есть если это не работа для представления (например, обновление пользовательского интерфейса).

С другой стороны, View-Model не имеет ссылки на View, поэтому я должен усерднее играть с привязками данных.
Вы должны использовать DelegateCommands (это то же самое, что RelayCommands, верно?).

Хм ... больше вопросов ... Безопасно ли использовать одну и ту же модель представления с двумя представлениями / пользовательскими элементами управления?

Ох ... Я столкнулся с проблемой вчера, когда играл в MVVM.
Я создал CommandReference своей команды для привязки клавиш и назначил эту ссылку для свойства команды моей кнопки, ну, CanExecuted сработал в первый раз, но не обновил свойство IsEnabled, когда CanExecuted было правдой. Я исправил это, привязав команду непосредственно к кнопке и не используя ссылку. Вопрос в следующем: почему какой-то код связывает ссылку с объектами и почему другой код связывает команду напрямую?

Какие вещи, связанные с MVVM, я должен изучить? (Вчера я видел нечто, называемое привязанным поведением, но я не знаю, что это такое).

Я переписываю приложение для заметок, которое я разработал с использованием MVP, но теперь с MVVM. Я заменю события командами (используя DelegateCommand), исключу ссылки на представления в View-Model, и я думаю, что это все, потому что примеры, которые я видел в MVVM, очень похожи на MVP.

Хорошо, я буду признателен, если вы укажете мне на все недоразумения, которые у меня есть с этим шаблоном.

Спасибо, и в будущем я помогу следующим новичкам MVVM:)

Ответы [ 2 ]

12 голосов
/ 15 июня 2009

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

  • MVVM не обязательно является разновидностью MVP. MVP сам по себе является неоднозначным, загруженным термином. Мартин Фаулер сделал это справедливо, разделив его на две структуры . MVVM стоит сам по себе, но разделяет некоторые концепции с шаблонами MVP. Как и все шаблоны пользовательского интерфейса, он стремится максимально отделить логику представления от бизнес-логики. MVVM отличается от MVP тем, что создает модель исключительно для целей презентации (или модель представления ). Это отличается от того, как шаблоны MVP решают проблему разделения.
    • Пассивный вид - При пассивном виде вид никогда не видит модель.
    • Контролирующий контроллер - MVVM гораздо ближе к шаблону Контролирующего контроллера, чем к пассивному виду. Единственная реальная разница здесь может заключаться в том, что MVVM явно создает модель только для вида (отсюда и термин «модель представления»)
  • ViewModel не имеет ссылки на представление, поскольку оно служит моделью для данных представления. Это подходящая абстракция. Если бы он также ссылался на представление, у вас была бы двусторонняя зависимость, которая создала бы дополнительную связь. Кроме того, сама ViewModel не имеет реальной причины быть осведомленной о представлении. Его единственная задача - абстрагировать модель (фактическую бизнес-модель) от представления.
  • DelegateCommands против RelayCommands - я полагаю, что вы получаете специфические технологии здесь, поэтому я не могу ответить на этот вопрос хорошо.
  • Вы не должны проектировать ViewModel для более чем одного представления. Это только создает сопряженность, поскольку, если вы измените представление, вам придется выяснить, какие ViewModels могут быть затронуты, и изменить их. Это может привести к каскадному эффекту. Ваше поведение должно быть в бизнес-модели, а не в ViewModel, поэтому ViewModel должна содержать только логику перевода и обработки событий.
  • Однако было бы неплохо иметь соотношение ViewModel и UserControl 1: 1, поскольку предполагается, что UserControls могут выступать в качестве автономных блоков на вашем экране.
  • Что касается других специфичных для технологии вопросов, извините, у меня нет ответа. Однако я могу предложить вам внимательно прочитать ссылки, которые я включил для Пассивного просмотра , Контролирующий контроллер и Презентационная модель . Предоставляют некоторый контекст шаблонам пользовательского интерфейса и являются технологически нейтральными.

Важно помнить, что, хотя MVVM подходит для решения проблем, возникающих при использовании WPF, он не является технологическим паттерном. Если вы слишком глубоко погрузитесь в конкретную реализацию, не понимая основополагающую философию, вы можете сделать некоторые очень большие ошибки на раннем этапе и обнаружить их только после того, как станет слишком поздно. К сожалению, MVVM не является хорошо документированным шаблоном, и вы правы, когда заявляете, что у каждого свое представление о том, что это такое.

Это не революционный шаблон (он существовал годами под разными именами), но привязка данных WPF делает его жизнеспособным решением сейчас, и поэтому он обретает новую популярность. Это хороший паттерн, но это не доктрина. Подходите к каждому «диктату», с которым вы столкнулись, с соответствующим количеством скептицизма.

EDIT

@ micahtan прав, утверждая, что привязка данных является очень важной частью в WPF. Я заявил, что привязка данных в WPF обеспечивает решение MVVM, но сама привязка очень мощная, поэтому внедрение MVVM растет быстрее, чем в литературе, окружающей его.

1 голос
/ 19 ноября 2009

На самом деле вам не нужно использовать RelayCommand. Все, что вам действительно нужно сделать, это реализовать интерфейс ICommand на объекте. В SoapBox Core Framework я определил интерфейс под названием ICommandControl и все кнопки ViewModels и т. Д. Реализуют это. Существует также класс AbstractCommandControl , который вы можете использовать для его реализации.

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