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


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

Обновлен: Ноябрь 2007

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

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

  • Предварительные условия
  • Реализация загрузчика XAML WPF и производительность
  • Последствия использования пользовательских свойств зависимостей
  • Связанные разделы

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

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

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

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

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

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

Поскольку текущая реализация обработчика XAML приложения WPF при установке свойства полностью обходит оболочки, не следует помещать дополнительную логику в определения метода «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); }
}

См. также

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

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

Общие сведения о XAML

Метаданные свойства зависимости

Свойства зависимостей типа коллекция

Безопасность свойства зависимости

Шаблоны безопасного конструктора для DependencyObjects