Откройте файл MainWindow.xaml.cs
, добавьте последнюю вспомогательную функцию по имени ConfigureGrid()
и вызовите ее в конструкторе после конфигурирования ApplicationDbContext
. Понадобится добавить лишь несколько строк кода:
private void ConfigureGrid()
{
using var repo = new CarRepo(_context);
gridInventory.ItemsSource = repo
.GetAllIgnoreQueryFilters()
.ToList()
.Select(x=> new {
x.Id,
Make=x.MakeName,
x.Color,
x.PetName
});
}
Запустив проект, вы увидите данные, заполняющие сетку. При желании сделать сетку более привлекательной можно применить окно Properties в Visual Studio для редактирования свойств сетки, чтобы улучшить ее внешний вид.
На этом текущий пример завершен. В последующих главах вы увидите в действии другие элементы управления, но к настоящему моменту вы должны чувствовать себя увереннее с процессом построения пользовательских интерфейсов в Visual Studio, а также при работе с разметкой XAML и кодом С#.
Роль свойств зависимости
Подобно любому API-интерфейсу .NET Core внутри WPF используется каждый член системы типов .NET Core (классы, структуры, интерфейсы, делегаты, перечисления) и каждый член типа (свойства, методы, события, константные данные, поля только для чтения и т.д.). Однако в WPF также поддерживается уникальная программная концепция под названием
Как и "нормальное" свойство .NET Core (которое в литературе, посвященной WPF, часто называют
Вы будете практически всегда пребывать в блаженном неведении относительно того, что фактически устанавливаете (или читаете) свойство зависимости, а не свойство CLR! Например, свойства Height
и Width
, которые элементы управления WPF наследуют от класса FrameworkElement
, а также член Content
, унаследованный от класса ControlContent
, на самом деле являются свойствами зависимости:
С учетом всех указанных сходств возникает вопрос: зачем нужно было определять в WPF новый термин для такой знакомой концепции? Ответ кроется в способе реализации свойства зависимости внутри класса. Пример кода будет показан позже, а на высоком уровне все свойства зависимости создаются описанным ниже способом.
• Класс, который определяет свойство зависимости, должен иметь в своей цепочке наследования класс DependencyObject
.
• Одиночное свойство зависимости представляется как открытое, статическое, допускающее только чтение поле типа DependencyProperty
. По соглашению это поле именуется путем снабжения имени оболочки CLR (см. последний пункт списка) суффиксом Property.
• Переменная типа DependencyProperty
регистрируется посредством вызова статического метода DependencyProperty.Register()
, который обычно происходит в статическом конструкторе или встраивается в объявление переменной.
• В классе будет определено дружественное к XAML свойство CLR, которое вызывает методы, предоставляемые классом DependencyObject
, для получения и установки значения.
После реализации свойства зависимости предлагают несколько мощных инструментов, которые применяются разнообразными технологиями WPF, в том числе привязкой данных, службами анимации, стилями, шаблонами и т.д. Мотивацией создания свойств зависимости было желание предоставить способ вычисления значений свойств на основе значений из других источников. Далее приведен список основных преимуществ, которые выходят далеко за рамки простой инкапсуляции данных, обеспечиваемой свойствами CLR.
• Свойства зависимости могут наследовать свои значения от определения XAML родительского элемента. Например, если в открывающем дескрипторе Window определено значение для атрибута FontSize
, то все элементы управления внутри Window
по умолчанию будут иметь тот же самый размер шрифта.
• Свойства зависимости поддерживают возможность получать значения, которые установлены элементами внутри их области определения XAML, например, в случае установки элементом Button
свойства Dock
родительского контейнера DockPanel
. (Вспомните, что присоединяемые свойства делают именно это, поскольку являются разновидностью свойств зависимости.)
• Свойства зависимости позволяют инфраструктуре WPF вычислять значение на основе множества внешних значений, что может быть важно для служб анимации и привязки данных.