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

Это подводит к финальному параметру метода DependencyProperty.Register() — второму делегату типа ValidateValueCallback, указывающему на метод класса FrameworkElement, который вызывается для проверки достоверности значения, присваиваемого свойству:

new ValidateValueCallback(FrameworkElement.IsWidthHeightValid)

Метод IsWidthHeightValid() содержит логику, которую обычно ожидают найти в блоке установки значения свойства (как более подробно объясняется в следующем разделе):

private static bool IsWidthHeightValid(object value)

{

  double num = (double) value;

  return ((!DoubleUtil.IsNaN(num) && (num >= 0.0))

    && !double.IsPositiveInfinity(num));

}

После того, как объект DependencyProperty зарегистрирован, остается упаковать поле в обычное свойство CLR (Height в рассматриваемом случае). Тем не менее, обратите внимание, что блоки get и set не просто возвращают или устанавливают значение double переменной-члена уровня класса, а делают это косвенно с использованием методов GetValue() и SetValue() базового класса System.Windows.DependencyObject:

public double Height

{

  get { return (double) base.GetValue(HeightProperty); }

  set { base.SetValue(HeightProperty, value); }

}

<p id="AutBody_Root1167"><strong>Важные замечания относительно оболочек свойств CLR</strong></p>

Подводя итог, следует отметить, что свойства зависимости выглядят как обычные свойства, когда вы извлекаете или устанавливаете их значения в разметке 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, так что давайте рассмотрим, каким образом создается свойство зависимости.

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных