Читаем Язык программирования C#9 и платформа .NET5 полностью

Подводя итог, следует отметить, что свойства зависимости выглядят как обычные свойства, когда вы извлекаете или устанавливаете их значения в разметке XAML либо в коде, но "за кулисами" они реализованы с помощью гораздо более замысловатых программных приемов. Вспомните, что основным назначением этого процесса является построение специального элемента управления, имеющего специальные свойства, которые должны быть интегрированы со службами WPF, требующими взаимодействия через свойства зависимости (например, с анимацией, привязкой данных и стилями).

Несмотря на то что часть реализации свойства зависимости предусматривает определение оболочки CLR, вы никогда не должны помещать логику проверки достоверности в блок set. К тому же оболочка CLR свойства зависимости не должна делать ничего кроме вызовов GetValue или SetValue.

Исполняющая среда WPF сконструирована таким образом, что если написать разметку XAML, которая выглядит как установка свойства, например:

то исполняющая среда вообще обойдет блок установки свойства Height и напрямую вызовет метод SetValue! Причина такого необычного поведения связана с простым приемом оптимизации. Если бы исполняющая среда WPF обращалась к блоку установки свойства Height, то ей пришлось бы во время выполнения выяснять посредством рефлексии, где находится поле DependencyProperty (указанное в первом аргументе SetValue), ссылаться на него в памяти и т.д. То же самое остается справедливым и при написании разметки XAML, которая извлекает значение свойства Height — метод GetValue будет вызываться напрямую. Но раз так, тогда зачем вообще строить оболочку CLR? Дело в том, что XAML в WPF не позволяет вызывать функции в разметке, поэтому следующий фрагмент приведет к ошибке:

На самом деле установку или получение значения в разметке с применением оболочки CLR следует считать способом сообщения исполняющей среде WPF о необходимости вызова методов GetValue/SetValue, т.к. напрямую вызывать их в разметке невозможно. А что, если обратиться к оболочке CLR в коде, как показано ниже?

Button b = new Button;

b.Height = 10;

В таком случае, если блок set свойства Height содержит какой-то код помимо вызова SetValue, то он должен выполниться, потому что оптимизация синтаксического анализатора XAML в WPF не задействуется.

Запомните основное правило: при регистрации свойства зависимости используйте делегат ValidateValueCallback для указания на метод, который выполняет проверку достоверности данных. Такой подход гарантирует корректное поведение независимо от того, что именно применяется для получения/установки свойства зависимости — разметка XAML или код.

<p id="AutBody_Root1168"><strong>Построение специального свойства зависимости</strong></p>

Если к настоящему моменту вы слегка запутались, то такая реакция совершенно нормальна. Создание свойств зависимости может требовать некоторого времени на привыкание. Как бы то ни было, но это часть процесса построения многих специальных элементов управления WPF, так что давайте рассмотрим, каким образом создается свойство зависимости.

Начните с создания нового проекта приложения WPF по имени CustomDependencyProperty. Выберите в меню Project (Проект) пункт Add User Control (WPF) (Добавить пользовательский элемент управления (WPF)) и создайте элемент управления с именем ShowNumberControl.xaml.

На заметку! Более подробные сведения о классе UserControl в WPF ищите в главе 27, а пока просто следуйте указаниям по мере проработки примера.

Подобно окну типы UserControl в WPF имеют файл XAML и связанный файл кода. Модифицируйте разметку XAML пользовательского элемента управления, чтобы определить простой элемент Label внутри Grid:

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  xmlns:local="clr-namespace: CustomDependencyProperty"

  mc:Ignorable="d"

  d:DesignHeight="300" d:DesignWidth="300">

 

   

      Background="LightBlue"/>

 

В файле кода для данного элемента создайте обычное свойство .NET Core, которое упаковывает поле типа int и устанавливает новое значение для свойства Content элемента Label:

public partial class ShowNumberControl : UserControl

{

  public ShowNumberControl

  {

    InitializeComponent;

  }

  // Обычное свойство .NET Core.

  private int _currNumber = 0;

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT