Объяснение в одном предложении:
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 представит определенные данные под определенными именами. Эта инкапсуляция позволяет очень легко определять роли в больших проектах или создавать ограниченный пользовательский интерфейс для проверки логики, пока реальный обрабатывается.