Система привязки, встроенная в приложения на основе XAML, устраняет указанную проблему за счет того, что позволяет привязывать объекты данных и коллекции к системе уведомлений, разрабатывая их как наблюдаемые. Всякий раз, когда изменяется значение свойства в наблюдаемой модели либо происходит изменение в наблюдаемой коллекции (например, добавление, удаление или переупорядочение элементов), инициируется событие (NotifyPropertyChanged
либо NotifyCollectionChanged
). Инфраструктура привязки автоматически прослушивает такие события и в случае их появления обновляет привязанные элементы управления. Более того, разработчики имеют контроль над тем, для каких свойств выдаются уведомления. Выглядит безупречно, не так ли? На самом деле все не
Наблюдаемые модели и коллекции
В этом разделе вы построите приложение, в котором используются наблюдаемые модели и коллекции. Для начала создайте новый проект приложения WPF по имени WpfNotifications
. В приложении будет применяться форма "главная-подробности", которая позволит пользователю выбирать объект автомобиля в элементе управления ComboBox
и просматривать детальную информацию о нем в расположенных ниже элементах управления TextBox
. Поместите в файл MainWindow.xaml
следующую разметку:
SharedSizeGroup="CarLabels"/>
DisplayMemberPath="PetName" />
SharedSizeGroup="CarLabels"/>
HorizontalAlignment="Right" Orientation="Horizontal" Margin="0,5,0,5">
Padding="4, 2"/>
Окно должно напоминать показанное на рис. 28.1.
Свойство IsSharedSizeScope
элемента управления Grid
заставляет дочерние сетки разделять размеры. Элемент ColumnDefinitions
, помеченный как SharedSizeGroup
, автоматически получит ту же самую ширину без каких-либо потребностей в программировании. В рассматриваемом примере, если размер метки Pet Name (Дружественное имя) изменяется из-за более длинного значения, тогда соответствующим образом корректируется и размер колонки Vehicle (Автомобиль), который находится в другом элементе управления Grid
, сохраняя аккуратный внешний вид окна.
Щелкните правой кнопкой мыши на имени проекта в окне Solution Explorer, выберите в контекстном меню пункт Add►New Folder (Добавить►Новая папка) и назначьте новой папке имя Models
. Создайте в новой папке файл класса Car.cs
. Первоначально код класса выглядит так:
public class Car
{
public int Id { get; set; }
public string Make { get; set; }
public string Color { get; set; }
public string PetName { get; set; }
}
Добавление привязок и данных
Следующий шаг заключается в создании операторов привязки для элементов управления. Вспомните, что конструкции привязки данных вращаются вокруг контекста данных, который может быть установлен в самом элементе управления или в родительском элементе управления. Здесь контекст будет установлен в элементе DetailsGrid
, так что каждый содержащийся внутри него элемент управления унаследует результирующий контекст данных.
Установите свойство DataContext
в свойство SelectedItem
элемента ComboBox
. Модифицируйте определение элемента Grid
, содержащего элементы управления с информацией об автомобиле, следующим образом:
DataContext="{Binding ElementName=cboCars, Path=SelectedItem}">
Текстовые поля в элементе DetailsGrid
будут отображать индивидуальные характеристики выбранного автомобиля. Добавьте подходящие атрибуты Text
и привязки к элементам управления TextBox
:
Наконец, поместите нужные данные в элемент управления ComboBox
. В файле MainWindow.xaml.cs
создайте новый список записей Car
и присвойте его свойству ItemsSource
элемента ComboBox
. Кроме того, добавьте оператор using
для пространства имен WpfNotifications.Models
.
using WpfNotifications.Models;
// Для краткости код не показан.
public partial class MainWindow : Window
{
readonly IList
public MainWindow()
{
InitializeComponent();
_cars.Add(new Car {Id = 1, Color = "Blue", Make = "Chevy",