Загрузка кода XAML и свойства зависимостей

Текущая реализация WPF обработчика XAML изначально учитывает свойство зависимостей. Обработчик XAML WPF использует системные методы свойств для свойств зависимостей при загрузке двоичных атрибутов XAML и обработки атрибутов, которые являются свойствами зависимостей. При этом выполняется обход оболочек свойств. При реализации пользовательских свойств зависимостей необходимо учитывать такое поведение и избегать размещения в оболочке свойства любого другого кода, отличного от методов GetValue и SetValue системы свойств.

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

В этом разделе предполагается, что вы, как пользователь и разработчик, понимаете свойства зависимостей и ознакомились с разделами Общие сведения о свойствах зависимости и Пользовательские свойства зависимостей. Следует также прочитать разделы XAML в WPF и Подробное описание синтаксиса XAML.

Реализация загрузчика XAML WPF и производительность

С точки зрения реализации для определения свойства как свойства зависимости и для доступа к методу SetValue системы свойств требуется значительно меньше затрат вычислительных ресурсов, чем при использовании оболочки свойства и ее метода задания. Причина этого заключается в том, что процессору XAML требуется вывести всю объектную модель вспомогательного кода, основываясь только на сведениях о типе и связях между членами, которые определены структурой разметки и различными строками.

Поиск типа осуществляется посредством сочетания элементов XMLNS и атрибутов сборки, но для идентификации членов, определения тех членов, которые можно установить в качестве атрибута, и типов, поддерживаемых значениями свойств, требуется расширенное отражение с помощью объекта PropertyInfo. Так как свойства зависимостей данного типа доступны в виде таблицы хранилища с помощью системы свойств, WPF-реализация соответствующего процессора XAML использует эту таблицу и выводит, что любое данное свойство ABC может быть эффективнее задано путем вызова метода SetValue в содержащем его производном типе DependencyObject с использованием идентификатора свойства зависимости свойство_ABC.

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

Так как текущая WPF-реализация процессора XAML при установке свойства полностью обходит оболочки, не следует помещать дополнительную логику в определения метода set оболочки для пользовательского свойства зависимости. Если поместить такую логику в определение метода set, она не будет выполняться, когда свойство задается в XAML, а не в коде.

Аналогичным образом другие аспекты процессора XAML, которые получают значения свойств в результате обработки кода XAML, также используют метод GetValue вместо оболочки. Поэтому следует также избегать любых дополнительных реализаций в определении метода get за пределами вызова метода GetValue.

В приведенном ниже примере показано рекомендуемое определение свойства зависимости с оболочками, где идентификатор свойства хранится в виде поля с атрибутами publicstaticreadonly, а определения методов get и set не содержат никакого кода, кроме необходимых методов системы свойств, определяющих резервное свойство зависимости.


public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender,
      new PropertyChangedCallback(OnUriChanged)
  )
);
public Uri AquariumGraphic
{
  get { return (Uri)GetValue(AquariumGraphicProperty); }
  set { SetValue(AquariumGraphicProperty, value); }
}

Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
    Get
        Return CType(GetValue(AquariumGraphicProperty), Uri)
    End Get
    Set(ByVal value As Uri)
        SetValue(AquariumGraphicProperty, value)
    End Set
End Property

См. также