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


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

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

В этом разделе содержатся следующие подразделы.

  • Предварительные требования
  • Существующие свойства зависимости только для чтения
  • Создание пользовательского свойства зависимостей только для чтения
  • Связанные разделы

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Основные понятия

Общие сведения о свойствах зависимости

Пользовательские свойства зависимостей

Стилизация и использование шаблонов