У меня есть некоторые вопросы о шаблоне MVVM

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

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

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

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

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

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

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

Ум … еще вопросы … Безопасно ли использовать одну и ту же модель View с двумя представлениями / пользовательскими элементами управления?

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

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

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

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

Спасибо, и в будущем я помогу новым новичкам MVVM 🙂

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

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

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

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

РЕДАКТИРОВАТЬ

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

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