Поделиться через


Read-Only свойства зависимостей

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

Необходимые условия

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

Существующие свойства зависимостей Read-Only

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

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

Создание настраиваемых свойств зависимостей Read-Only

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

Большая часть процесса создания свойства зависимости, доступного только для чтения, аналогичен описанному в темах Настраиваемые свойства зависимостей и Реализация свойства зависимости. Существует три важных различия:

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

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

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

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

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

См. также