Свойства зависимости "только для чтения"

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

Необходимые компоненты

В этом разделе предполагается, что вы понимаете основные сценарии реализации свойства зависимостей и способы применения метаданных к настраиваемому свойству зависимостей. Дополнительные сведения см. в разделах Пользовательские свойства зависимостей и Метаданные свойства зависимостей.

Существующие свойства зависимостей "только для чтения"

Некоторые свойства зависимостей, определенные в среде Windows Presentation Foundation (WPF), доступны только для чтения. Типичной причиной для указания свойства зависимости "только для чтения" является то, что это свойства, которые должны использоваться для определения состояния там, где это состояние зависит от множества факторов, но простая настройка этого состояния для данного свойства нежелательна с точки зрения дизайна пользовательского интерфейса. Например, свойство IsMouseOver действительно отображает только состояние, определяемое вводом с помощью мыши. Любая попытка установить это значение программно путем обхода истинного ввода с помощью мыши будет непредсказуемой и вызовет несогласованность.

Поскольку свойства зависимостей "только для чтения" нельзя устанавливать, они не подходят для многих сценариев, для которых свойства зависимостей обычно предлагают решение (а именно: привязка данных с возможностью прямого использования стилей для значения, проверки, анимации, наследования). Несмотря на то что их нельзя устанавливать, свойства зависимостей "только для чтения" обладают некоторыми дополнительными возможностями, которые поддерживаются свойствами зависимостей в системе свойств. Наиболее важной оставшейся возможностью является то, что свойство зависимости "только для чтения" по-прежнему можно использовать как триггер свойств в стиле. Невозможно включить триггеры с помощью обычного свойства CLR. Оно должно быть свойством зависимостей. Вышеупомянутое свойство IsMouseOver является отличным примером сценария, в котором может быть весьма полезным определение стиля элемента управления, где некоторые отображаемые свойства, такие как фоновый рисунок, основной цвет или похожие свойства сложных элементов в элементе управления, будут изменяться, когда пользователь наведет указатель мыши на определенную область элемента управления. Изменения в свойстве зависимостей "только для чтения" также могут обнаруживаться и сообщаться внутренними процессами определения недействительности в системе свойств. Фактически, это внутренняя поддержка функциональности триггера свойств.

Создание пользовательских свойств зависимостей "только для чтения"

Обязательно ознакомьтесь с вышеприведенным разделом, описывающим, почему свойства зависимостей "только для чтения" не будут работать для многих типичных сценариев свойств зависимостей. Однако при наличии соответствующего сценария можно создать собственное свойство зависимостей "только для чтения".

Большая часть процесса создания свойства зависимостей "только для чтения" аналогична описанному в разделах Пользовательские свойства зависимостей и Реализация свойства зависимостей. Однако есть три важных отличия.

  • При регистрации свойства следует вызвать метод RegisterReadOnly вместо обычного метода Register для регистрации свойства.

  • При реализации свойства wrapper для CLR убедитесь, что в программе-оболочке нет реализации set, и таким образом, отсутствует несогласованность в состоянии «только для чтения» для открытой программы-оболочки.

  • Объект, возвращаемый регистрацией только для чтения, — DependencyPropertyKey вместо DependencyProperty. Необходимо сохранить это поле в качестве члена, но обычно не нужно его делать общим членом для типа.

Любое частное поле или значение, заложенное в свойство зависимостей "только для чтения", может быть полностью записываемым с помощью любой выбранной логики. Однако самый простой способ задать свойство либо изначально, либо в составе логики выполнения — это использовать API-интерфейсы системы свойств, а не обходить систему свойств и настраивать частное резервное поле напрямую. В частности, есть сигнатура SetValue, которая принимает параметр типа DependencyPropertyKey. Способ установления этого значения программно в логике приложения будет влиять на способ установления доступа к DependencyPropertyKey, созданному при первой регистрации свойства зависимостей. Если обрабатывать эту логику внутри класса, то можно сделать ее частной. Если необходимо устанавливать ее из других частей сборки, можно сделать ее внутренней. Одним из подходов является вызов SetValue внутри обработчика событий класса для соответствующего события, сообщающего экземпляру класса о необходимости изменения хранимого значения свойства. Другой подход заключается в связывании свойств зависимостей с помощью парных обратных отзывов PropertyChangedCallback и CoerceValueCallback в составе метаданных этих свойств во время регистрации.

Поскольку свойство DependencyPropertyKey является частным и не распространяется системой свойств за пределы вашего кода, свойство зависимостей «только для чтения» имеет лучшую безопасность настройки, чем свойство зависимостей с возможностью чтения и записи. Для свойства зависимостей с возможностью чтения и записи идентифицирующее поле является явно или неявно общим, и таким образом, свойство является широко устанавливаемым. Дополнительные сведения см. в разделе Безопасность свойства зависимостей.

См. также