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

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

Предварительные требования

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

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

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

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

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

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

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

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

  • При реализации свойства "оболочка CLR" убедитесь, что оболочка не имеет реализации набора, так что не существует несогласованности в состоянии только для чтения для предоставляемой общедоступной обертки.

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

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

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

См. также раздел