WPF, MVVM модел

MVVM (Model-View-ViewModel) - това е модел, който се появи, за да заобиколи ограниченията на моделите на MVC и MVP и комбинира някои от техните силни страни. Този модел се появи за първи път като част от рамката на Small Talk през 80-те години, а по-късно беше подобрен с актуализиран модел на презентация (MVP).

Следващата фигура предоставя диаграма, която показва как да се приложи шаблонът MVVM. Разбира се, това е общо изпълнение:

модел

Ако планирате да работите с WPF или Silverlight, трябва да използвате механизма за свързване, предоставен от тези технологии. За да направите това, вашият изглед на модел трябва да внедри някои от специфичните интерфейси, изисквани от обвързването на WPF и Silverlight. Един от тях е INotifyPropertyChanged, въведена във .NET Framework версия 2 и по-нова. Този интерфейс изпълнява система за уведомяване, която се активира при промяна на стойността на свойството. Това се изисква в модела на изглед, за да се направи динамичен механизмът за свързване на потребителския интерфейс XAML.

Друга настройка са командите, предоставени от интерфейса ICommand, които са достъпни за WPF и Silverlight. Командите могат да се свързват с определен XAML елемент и да определят поведението на този елемент за конкретни действия.

Третият компонент в структурата, показана по-горе, е DataTemplate, който определя как да се структурира определен модел на изглед или конкретно състояние на модел на изглед.

Примерно приложение на MVVM

изгледа модела

Както можете да видите, изгледът вече е празен (съдържа само потребителския интерфейс в XAML), цялата логика се основава на връзката между модела и изгледа на модела.

Преглед на структурата на моделите

За това приложение ще ни трябват два вида модели. Всеки модел на изглед има свои собствени задачи за преглед. Използването на множество вложени модели се нарича модел на йерархичен изглед.

ProjectsViewModel в нашето приложение ще съдържа състоянието и логиката на ProjectsView, както е показано на следващата фигура:

действителната цена

Свойствата на свързване и тяхното предназначение са описани по-долу:

Проекти - Представлява актуализируема ObservableCollection

да се свърже с елемента ComboBox от огледа.

SelectedValue е цяло число свойство, обвързано с избрания проект в ComboBox с помощта на еднопосочно свързване. Това свойство помага да получавате известия, когато избраният елемент се промени в ComboBox.

SelectedProject - свойство, което свързва подробности за презентацията (прогнозна цена, действителни разходи) с типа проект.

DetailsEnabled - Обвързва се със свойството IsEnabled на текстовите полета с прогнозни и действителни стойности в изгледа. Ако в ComboBox не е избран проект, полетата се заключват.

DetailsEstimateStatus - изброяване на класа Status, който се свързва в тригери, които контролират цвета на текстовото поле на действителната стойност.

UpdateCommand - прототип на интерфейса ICommand, свързан с UpdateButton.

Вторият ProjectViewModel ще съдържа състоянието на изгледа и логиката за управление на детайлите в нашия изглед (действителни и прогнозни разходи):

действителната цена

Структурата на този изглед на модел е много подобна на базовия клас Project, защото реализира интерфейса IProject. (Позволете ми да ви напомня, ако все още не сте направили това, трябва да добавите препратка към сборката ProjectBilling.DataAccess.dll, която създадохме в темата RAD & Monolitic и представляваща кода за достъп до данни - базовия клас на Project, IProject интерфейс и няколко помощни метода за извличане на данни.)

Моделът в нашето приложение е представен от клас ProjectsModel, който реализира интерфейса IProjectsModel. Интерфейсът, който добавих, за да позволи приложението да бъде разширено чрез инжектиране на зависимости и за улесняване на тестването, включва следните членове:

Проекти - съдържа колекция от проекти на ObservableCollection

ProjectsViewModel, свързан със свойството Projects.

ProjectUpdated - събитие за актуализиране на данните за проекта. Опресняването на данните в модела автоматично ще опресни всички изгледи в приложението.

UpdateProject всъщност е манипулатор за събитие ProjectUpdated, което извиква метода Update () на екземпляра на Project.

Първо, трябва да дефинираме няколко помощни класа и интерфейса IProjectsModel. Класът Notifier реализира интерфейса INotifyPropertyChanged и ще бъде използван в Model и Model View за известия за промени. Това всъщност е обвивка около капсулирането INotifyPropertyChanged. Класът ProjectsEventArgs просто добавя аргументи (под формата на свойства) към манипулатора на събития IProjectsModel.ProjectUpdated (в нашия пример ще предадем само препратка към прототипа IProject). Добавете следния код към вашия модел модел, например BillingProject.Model.cs:

Структурата на класа ProjectsModel изглежда така:

ProjectViewModel

Сега нека добавим клас ProjectViewModel, който реализира един от двата изгледа на модела:

Интерфейсът IProjectViewModel изисква да добавите връзка към това изброяване. Самият клас ProjectViewModel е доста прост, той декларира няколко частни променливи (капсулирани в публични свойства), които съответстват на подписа на базовия клас Project. ProjectViewModel наследява от Notifier, така че поддръжката за уведомяване за промени е активирана в публични свойства.