Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Добавьте свойство

DataContext
к объявлению окна в разметке XAML:

DataContext="{Binding ViewModel, RelativeSource={RelativeSource Self}}"

Обновление разметки элементов управления

Теперь, когда свойство

DataContext
для
Window
установлено в модель представления, потребуется обновить привязки элементов управления в разметке XAML. Начиная с поля со списком, модифицируйте разметку за счет добавления свойства
ItemsSource
:

<ComboBox Name="cboCars" Grid.Column="1" DisplayMemberPath="PetName"

ItemsSource="{Binding Cars}" />

Прием

работает, т.к. контекстом данных для
Window
является
MainWindowViewModel
, a
Cars
— открытое свойство модели представления. Вспомните, что конструкции привязки обходят дерево элементов до тех пор, пока не найдут контекст данных. Далее понадобится обновить привязки для элементов управления
Button
. Задача проста; поскольку привязки уже установлены на уровне окна, нужно лишь модифицировать конструкции привязки, чтобы они начинались со свойства
DataContext
:

<Button x:Name="btnAddCar" Content="Add Car"

Margin="5,0,5,0" Padding="4, 2"

Command="{Binding Path=DataContext.AddCarCmd,

RelativeSource={RelativeSource Mode=FindAncestor,

AncestorType={x:Type Window}}}"

CommandParameter="{Binding ElementName=cboCars, Path=ItemsSource}"/>

<Button x:Name="btnDeleteCar" Content="Delete Car"

Margin="5,0,5,0" Padding="4, 2"

Command="{Binding Path=DataContext.DeleteCarCmd,

RelativeSource={RelativeSource Mode=FindAncestor,

AncestorType={x:Type Window}}}"

CommandParameter="{Binding ElementName=cboCars, Path=SelectedItem}" />

<Button x:Name="btnChangeColor" Content="Change Color"

Margin="5,0,5,0" Padding="4, 2"

Command="{Binding Path=DataContext.ChangeColorCmd,

RelativeSource={RelativeSource Mode=FindAncestor,

AncestorType={x:Type Window}}}"

CommandParameter="{Binding ElementName=cboCars, Path=SelectedItem}"/>

Итоговые сведения о моделях представлений

Верите или нет, но вы только что закончили построение первого WPF-приложения MWM. Вы можете подумать: "Это не реалистичное приложение. Как насчет данных? Данные в примере жестко закодированы". И вы будете совершенно правы. Это не реальное приложение, а лишь демонстрация. Однако в ней легко оценить всю прелесть паттерна MWM. Представлению ничего не известно о том, откуда поступают данные; оно просто привязывается к свойству модели представления. Реализации модели представления можно менять, скажем, использовать версию с жестко закодированными данными во время тестирования и версию, обращающуюся к базе данных, в производственной среде.

Можно было бы обсудить еще немало вопросов, в том числе разнообразные инфраструктуры с открытым кодом, паттерн "Локатор модели представления" (View Model Locator) и множество разных мнений на предмет того, как лучше реализовывать паттерн MWM. В том и заключается достоинство паттернов проектирования программного обеспечения — обычно существует много правильных способов их реализации, и вам необходимо лишь отыскать стиль, который наилучшим образом подходит к имеющимся требованиям.

Обновление проекта AutoLot.Dal для MWM

Если

вы хотите обновить проект
AutoLot.Dal
для MWM, то должны применить изменения, которые вносились в
Car
, ко всем сущностям в проекте
AutoLot.Dal.Models
, включая
BaseEntity
.

Резюме

В главе рассматривались аспекты WPF, относящиеся к поддержке паттерна MWM. Сначала было показано, каким образом связывать классы моделей и коллекции с помощью системы уведомлений в диспетчере привязки. Демонстрировалась реализация интерфейса

INotifyPropertyChanged
и применение классов наблюдаемых коллекций для обеспечения синхронизации пользовательского интерфейса и связанных с ним данных.

Вы научились добавлять код проверки достоверности к модели с применением интерфейсов

IDataErrorInfo
и
INotifyDataErrorInfо
, а также проверять наличие ошибок, основанных на аннотациях данных. Было показано, как отображать обнаруженные ошибки проверки достоверности в пользовательском интерфейсе, чтобы пользователь знал о проблеме и мог ее устранить. Вдобавок был создан стиль и специальный шаблон элементов управления для визуализации ошибок более эффективным способом.

В заключение вы узнали, каким образом собирать все компоненты вместе за счет добавления модели представления, а также приводить в порядок разметку и отделенный код пользовательского интерфейса, чтобы усилить разделение обязанностей.

Часть IX

ASP.NET Core

Глава 29

Введение в ASP.NET Core

В финальной части книги рассматривается ASP.NET Core — последняя версия инфраструктуры для разработки веб-приложений, которая использует C# и .NET Core. В этой главе предлагается введение в инфраструктуру ASP.NET Core и раскрываются ее отличия от предыдущей версии, т.е. ASP.NET.

После ознакомления с основами паттерна "модель-представление-контроллер" (Model-View-Controller — MVC), реализованного в ASP.NET Core, вы приступите к построению двух приложений, которые будут работать вместе. Первое приложение, REST-служба ASP.NET Core, будет закончено в главе 30. Вторым приложением является веб-приложение ASP.NET Core, созданное с применением паттерна MVC, которое будет завершено в главе 31. Уровнем доступа к данным для обоих приложений послужат проекты

AutoLot.Dal
и
AutoLot.Models
, которые вы создали в главе 23.

Краткий экскурс в прошлое

Выпуск инфраструктуры ASP.NET MVC в 2007 году принес большой успех компании Microsoft. Инфраструктура базировалась на паттерне MVC и стала ответом разработчикам, разочарованным API-интерфейсом Web Forms, который по существу был ненадежной абстракцией поверх HTTP. Инфраструктура Web Forms проектировалась для того, чтобы помочь разработчикам клиент-серверных приложений перейти к созданию веб-приложений, и в этом отношении она была довольно успешной. Однако по мере того, как разработчики все больше и больше привыкали к процессу разработки веб-приложений, многим из них хотелось иметь более высокую степень контроля над визуализируемым выводом, избавиться от состояния представления и ближе придерживаться проверенных паттернов проектирования для веб- приложений. С учетом указанных целей и создавалась инфраструктура ASP.NET MVC.

Введение в паттерн MVC

Паттерн "модель-представление-контроллер" (Model-View-Controller — MVC) появился в 1970-х годах, будучи первоначально созданным для использования в Smalltalk. Относительно недавно его популярность возросла, в результате чего стали доступными реализации в различных языках, в том числе Java (Spring Framework), Ruby (Ruby on Rails) и .NET (ASP.NET MVC).

Модель

Поделиться с друзьями: