Одно предложение объяснение MVVM в WPF? - PullRequest
34 голосов
/ 20 июля 2009

Я слышал, что это следующая лучшая вещь в создании пользовательских интерфейсов WPF, но все существующие примеры имеют десятки строк кода - могу ли я получить Hello World для MVVM, который недвусмысленно объясняет, что это такое? Я довольно плохо знаком с C # /. Net, так что, возможно, укажите мне на некоторые ресурсы, которые тоже могут помочь?

Очень ценится!

Ответы [ 11 ]

73 голосов
/ 20 июля 2009

Объяснение в одном предложении:

MVVM - это переосмысление популярного паттерна Model-View-Presenter (MVP), специально разработанного для работы со средствами привязки данных, поставляемыми с WPF, для отделения логики приложения от дизайна пользовательского интерфейса.

Дольше, полезнее, объяснение:

Основной концепцией MVVM является разделение приложения WPF на отдельные компоненты, каждый из которых несет ответственность за получение информации на экране.

Во-первых, у вас есть модель. Это класс с очень ограниченными функциями, который обычно заполняется из какого-либо внешнего источника, такого как база данных или веб-сервис. Например:

public class MessageModel
{
    public string Message { get; set; }
}

Кроме того, вы накладываете слой ViewModel, здесь находится логика приложения, она уведомляет об изменениях модели и обеспечивает согласованность данных. Реализуя интерфейс INotifyPropertyChanged, WPF бесплатно предоставляет двухстороннее связывание данных между ViewModel и представлением:

public class MessageViewModel : INotifyPropertyChanged
{
     private MessageModel _model;

     public string Message
     {
          get { return _model.Message; }
          set
          {
              if (_model.Message != value)
              {
                  _model.Message = value;
                  OnPropertyChanged("Message");
              }
          }
     }
}

Наконец, у вас есть вид. Это файл xaml, который описывает макет элементов управления, используемых для отображения и редактирования данных в ViewModel:

<Canvas>
     <TextBox Text={"Binding Message"} />
</Canvas>

Причина, по которой вы предпринимаете все эти усилия, заключается в том, что Модель очень легкая и легко передается через границы домена. Его просто отправить или получить из веб-сервиса или сопоставить с таблицей базы данных. ViewModel, с другой стороны, сложен, но имеет мало зависимостей - ему все равно, откуда модель получает свои данные, только то, что он там есть, и у него вообще нет концепции представления, что делает его очень тестируемым ( логика вашего приложения не зависит от пользовательского интерфейса для тестирования). Наконец, xaml хорошо разделен и может быть передан разработчику, который не должен ничего знать о логике приложения, только то, что ViewModel представит определенные данные под определенными именами. Эта инкапсуляция позволяет очень легко определять роли в больших проектах или создавать ограниченный пользовательский интерфейс для проверки логики, пока реальный обрабатывается.

38 голосов
/ 07 февраля 2010

MVVM - это отношения звезд и фанатов. Фанат знает звезду, но звезда не знает фанат. Поклонник любит свою звезду так сильно, что, если звезда меняет себя (я имею в виду его стиль одежды), поклонник меняет себя соответственно.

Теперь замените «star» на «ViewModel» и «fan» на «View» и прочитайте его еще раз.

14 голосов
/ 20 июля 2009

Одно предложение? Здесь идет.

MVVM - это шаблон сегрегации пользовательского интерфейса, в котором Xaml (View) привязывается к фасаду (View Model), позволяя внутренностям вашей программы (Model) избегать утечек UI из слоя.

8 голосов
/ 20 июля 2009

Простое утверждение, которое помогло мне лучше понять его, было: «Могу ли я провести модульное тестирование своей бизнес-логики без пользовательского интерфейса?» Я думаю, что это должен быть вопрос, который вы задаете при изучении и проектировании с использованием концепций MVVM.

4 голосов
/ 20 июля 2009

На этом сайте есть отличная схема, которая объясняет это.

В основном у вас есть 3 компонента:
1) Модель - Модель данных вашего приложения. это довольно стандартно и так же, как любое приложение MVP или MVC.
2) View - XAML, который определяет представление / макет вашего приложения.
3) Модель представления - поскольку WPF требует, чтобы представление прикреплялось к вещам определенным образом (например, требует, чтобы коллекции реализовывали INotifyCollectionChanged и тому подобное), обычно требуется, чтобы вы немного массировали данные, чтобы получить их в форма, подходящая для отображения. Здесь код модели представления. Он упаковывает данные в модели представления, которые представление может легко отобразить. Это то, к чему будет привязан ваш взгляд XAML. Он должен отвечать на события из слоя модели и обновлять себя.

(Затем ваши контроллеры висят где-то сбоку - в идеале, с помощью команд WPF - и вносят изменения в модель, которая запускает события для обновления модели представления)

1 голос
/ 21 июля 2009

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

1 голос
/ 20 июля 2009

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

0 голосов
/ 31 мая 2011

Потому что вы не можете привязать данные к своему собственному кодексу

(здесь только половина шутки)

0 голосов
/ 10 ноября 2009

Уже есть несколько хороших объяснений в одном предложении (или близких к нему). Я просто добавлю к этому, сказав, что если вы прошли базовый уровень и хотите получить пример использования MVVM в реальном приложении с меню, панелью инструментов, диалоговыми окнами параметров, окнами инструментов закрепления и т. Д. взгляните на SoapBox Core и эту демонстрацию с использованием SoapBox Core . Он с открытым исходным кодом, так что вы можете получить много идей.

0 голосов
/ 20 июля 2009

Улучшенный ответ:

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

На самом деле, MVVM - это доработка паттерна, который существует уже некоторое время. Я помню, как развивался шаблон, когда я работал в MFC. Для этого есть как минимум две причины. MFC или <> довольно сложны, и смешивание конструкций MFC с логикой приложения делает приложение хрупким. Пример: замена списка со списком (или селектором в современных терминах) намного сложнее, если логика для поддержки содержимого списка / селектора сочетается с логикой для манипулирования самим списком / селектором.

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