Метаданные свойства зависимостей (WPF .NET)
Система свойств Windows Presentation Foundation (WPF) включает систему отчетов метаданных свойств зависимостей. Информация, доступная через систему отчетности по метаданным, превосходит ту, что доступна с помощью рефлексии или общих характеристик среды CLR. При регистрации свойства зависимостей можно создать и назначить метаданные ему. Если вы наследуете от класса, определяющего свойство зависимостей, можно переопределить метаданные для унаследованного свойства зависимостей. Если добавить ваш класс как владельца свойства зависимости, можно переопределить метаданные унаследованного свойства зависимости.
Необходимые условия
В статье предполагается, что у вас имеются базовые знания о свойствах зависимостей и вы уже ознакомились с Обзор свойств зависимостей. Чтобы следовать примерам в этой статье, это поможет вам, если вы знакомы с языком разметки расширяемых приложений (XAML) и узнаете, как писать приложения WPF.
Использование метаданных
Можно запрашивать метаданные свойства зависимостей, чтобы проверить характеристики свойства зависимостей. Когда система свойств обрабатывает свойство зависимостей, он получает доступ к его метаданным. Объект метаданных для свойства зависимостей содержит следующие типы сведений:
Значение по умолчанию свойства зависимостей, которое устанавливается системой свойств, если другое значение не применяется, например локальное, стиль или значение наследования. Дополнительные сведения о приоритете значений во время выполнения присвоения значений свойств зависимостей см. в разделе приоритет значений свойств зависимостей.
Ссылки на обратные вызовы значения приведения и обратные вызовы изменений свойств в типе владельца. Вы можете получить ссылки только на обратные вызовы, имеющие модификатор доступа
public
или находящиеся в пределах разрешенного доступа. Дополнительные сведения о обратных вызовах свойств зависимостей см. в обратном вызове свойств зависимостей и проверке.Характеристики свойства зависимостей на уровне платформы WPF (если свойство зависимостей является свойством платформы WPF). Процессы WPF, такие как подсистема макета платформы и логика наследования свойств, запрашивают метаданные на уровне платформы WPF. Дополнительные сведения см. вметаданных свойств
Framework.
API метаданных
Класс PropertyMetadata хранит большую часть метаданных, используемых системой свойств. Экземпляры метаданных можно создавать и назначать с помощью следующих методов:
Типы, которые регистрируют свойства зависимостей в системе свойств.
Типы, наследуемые от класса, который определяет свойство зависимостей.
Типы, которые добавляют себя в качестве владельца зависимого свойства.
Если тип регистрирует свойство зависимостей без указания метаданных, система свойств назначает объект PropertyMetadata
со значениями по умолчанию для этого типа свойству зависимостей.
Чтобы получить метаданные для свойства зависимостей, вызовите одну из перегрузок GetMetadata идентификатора DependencyProperty. Метаданные возвращаются как объект PropertyMetadata
.
Для различных архитектурных областей существуют более конкретные классы метаданных, производные от PropertyMetadata
. Например, UIPropertyMetadata поддерживает отчеты об анимации, а FrameworkPropertyMetadata поддерживает свойства платформы WPF. Свойства зависимостей также можно зарегистрировать в производных классах PropertyMetadata
. Хотя GetMetadata
возвращает объект PropertyMetadata
, если применимо, можно привести к производному типу для проверки свойств, специфичных для типа.
Характеристики свойств, предоставляемые FrameworkPropertyMetadata
, иногда называются флагами . При создании экземпляра FrameworkPropertyMetadata
можно передать экземпляр типа перечисления FrameworkPropertyMetadataOptions в конструктор FrameworkPropertyMetadata
.
FrameworkPropertyMetadataOptions
позволяет указать флаги метаданных в побитовом сочетании.
FrameworkPropertyMetadata
использует FrameworkPropertyMetadataOptions
, чтобы разумно контролировать длину сигнатуры конструктора. При регистрации свойств зависимостей флаги метаданных, заданные на FrameworkPropertyMetadataOptions
, предоставляются в FrameworkPropertyMetadata
как свойства Boolean
, а не побитовое сочетание флагов, чтобы сделать запросы характеристик метаданных более интуитивно понятными.
Переопределите или создайте новые метаданные?
При наследовании свойства зависимостей можно изменить характеристики свойства зависимости путем переопределения его метаданных. Однако вы не всегда можете выполнить сценарий свойства зависимости, переопределив метаданные, и иногда необходимо определить настраиваемое свойство зависимости в классе с новыми метаданными. Пользовательские свойства зависимостей имеют те же возможности, что и свойства зависимостей, определенные типами WPF. Дополнительные сведения см. в свойствах пользовательских зависимостей .
Одной из характеристик свойства зависимостей, которое нельзя переопределить, является его тип значения. Если свойство унаследованной зависимости имеет приблизительное поведение, но для сценария требуется другой тип значения, рассмотрите возможность реализации настраиваемого свойства зависимостей. Вы можете связать значения свойств с помощью преобразования типов или другой реализации в производном классе.
Сценарии переопределения метаданных
Примеры сценариев переопределения существующих метаданных свойства зависимостей:
Изменение значения по умолчанию, которое является общим сценарием.
Изменение или добавление обратных вызовов изменений свойств, которые могут потребоваться, если унаследованное свойство зависимостей взаимодействует с другими свойствами зависимостей, отличающимися от базовой реализации. Одной из характеристик модели программирования, поддерживающей код и разметку, является то, что значения свойств могут быть заданы в любом порядке. Этот фактор может повлиять на реализацию обратных вызовов, связанных с изменением свойств. Дополнительные сведения об обратных вызовах и проверке свойств зависимостей см. в разделе и.
Изменение параметров метаданных свойств фреймворка WPF , опции. Как правило, параметры метаданных задаются во время регистрации нового свойства зависимостей, но их можно изменить в OverrideMetadata или AddOwner вызовах. Дополнительные сведения о переопределении метаданных свойств платформы см. в разделе Об определенииFrameworkPropertyMetadata. Сведения о настройке параметров метаданных свойств платформы при регистрации свойства зависимостей см. в разделе Настраиваемые свойства зависимостей.
Заметка
Так как обратные вызовы проверки не являются частью метаданных, их нельзя изменить путем переопределения метаданных. Дополнительные сведения см. в разделе обратных вызовов значений проверки.
Переопределение метаданных
При реализации нового свойства зависимостей можно задать его метаданные с помощью перегрузки метода Register. Если класс наследует свойство зависимостей, можно переопределить унаследованные значения метаданных с помощью метода OverrideMetadata. Например, можно использовать OverrideMetadata
для задания определенных типов значений. Дополнительные сведения и примеры кода см. в разделе Переопределение метаданных для свойства зависимостей.
Пример свойства зависимостей WPF— Focusable. Класс FrameworkElement регистрирует Focusable
. Класс Control является производным от FrameworkElement
, наследует свойство зависимости Focusable
и переопределяет метаданные унаследованного свойства. Переопределение изменяет значение свойства по умолчанию с false
на true
, но сохраняет другие унаследованные значения метаданных.
Поскольку большинство существующих свойств зависимости не являются виртуальными, их унаследованная реализация затеняет существующий член. При переопределении характеристик метаданных новое значение метаданных заменяет исходное значение или объединяется:
Для DefaultValueновое значение заменит существующее значение по умолчанию. Если в метаданных переопределения не указана
DefaultValue
, значение поступает от ближайшего предка, у которого в метаданных указанаDefaultValue
.Для PropertyChangedCallbackлогика слияния по умолчанию сохраняет все
PropertyChangedCallback
значения в таблице, и все эти значения вызываются при изменении свойства. Порядок обратного вызова определяется глубиной класса, где обратный вызов, зарегистрированный базовым классом в иерархии, будет выполняться первым.Для CoerceValueCallbackновое значение заменит существующее
CoerceValueCallback
значение. Если в метаданных переопределения не указанаCoerceValueCallback
, значение поступает от ближайшего предка, который указалCoerceValueCallback
в метаданных.
Заметка
Логика слияния по умолчанию реализуется методом Merge. Вы можете указать пользовательскую логику слияния в производном классе, который наследует свойство зависимости, переопределив Merge
в этом классе.
Добавить класс в качестве владельца
Чтобы наследовать свойство зависимостей, зарегистрированное в другой иерархии классов, используйте метод AddOwner. Этот метод обычно используется, если добавляющий класс не является производным от типа, зарегистрированного как свойство зависимости. В вызове AddOwner
добавляемый класс может создавать и назначать метаданные, относящиеся к типу, для унаследованного свойства зависимостей. Чтобы быть полным участником системы свойств с помощью кода и разметки, класс добавления должен реализовать следующие открытые члены:
Поле идентификатора свойства зависимостей. Значение идентификатора свойства зависимостей — это возвращаемое значение вызова
AddOwner
. Это поле должно быть полемpublic static readonly
типа DependencyProperty.Оболочка CLR, реализующая
get
иset
аксессоры. Используя оболочку свойств, потребители свойств зависимостей могут получать или задавать значения свойств зависимостей так же, как и любое другое свойство CLR. Методы доступаget
иset
взаимодействуют с базовой системой свойств с помощью вызовов DependencyObject.GetValue и DependencyObject.SetValue, передавая идентификатор свойства зависимости в качестве параметра. Реализуйте оболочку так же, как при регистрации пользовательского свойства зависимости. Для получения дополнительных сведений см. пользовательские свойства зависимостей
Класс, вызывающий AddOwner
, имеет те же требования к предоставлению объектной модели унаследованного зависимого свойства, что и класс, который определяет новое пользовательское зависимое свойство. Дополнительные сведения см. в разделе Добавление типа владельца для свойства зависимостей.
Метаданные присоединенного свойства
В WPF большинство присоединенных к пользовательскому интерфейсу свойств в типах WPF реализуются как свойства зависимостей. Аттачируемые свойства, реализованные как свойства зависимостей, поддерживают концепции зависимых свойств, как, например, метаданные, которые производные классы могут переопределить. Метаданные для присоединенного свойства обычно не отличаются от свойства зависимостей. Вы можете переопределить значение по умолчанию, обратные вызовы изменения свойств и свойства фреймворка WPF для наследованного присоединенного свойства в экземплярах класса, который их переопределяет. Для получения дополнительной информации см. раздел Метаданные присоединенного свойства
Заметка
Всегда используйте RegisterAttached для регистрации атрибутов, где вы задаёте Inherits в метаданных. Несмотря на то, что наследование значений свойств может работать для неназначенных свойств зависимостей, поведение наследования значений для таких свойств через определенные разделения объектов в рабочем дереве не определено. Свойство Inherits
не имеет значения для несвязанных свойств. Дополнительные сведения см. в разделе RegisterAttached(String, Type, Type, PropertyMetadata)и разделе примечаний Inherits.
Добавить класс как владельца присоединенного свойства
Чтобы наследовать присоединенное свойство от другого класса, но предоставить его как неприcоединённое свойство зависимости для вашего класса:
Вызовите AddOwner, чтобы добавить ваш класс в качестве владельца прикрепленного свойства зависимостей.
Назначьте возвращаемое значение вызова
AddOwner
полюpublic static readonly
для использования в качестве идентификатора свойства зависимости.Определите оболочку CLR, которая добавляет свойство в качестве члена класса и поддерживает использование неприсоединенных свойств.
См. также
- PropertyMetadata
- DependencyObject
- DependencyProperty
- GetMetadata
- AddOwner
- Общие сведения о свойствах зависимостей
- метаданных свойства
Framework
.NET Desktop feedback