Compartilhar via


Carregando XAML e Propriedades de Dependência

A implementação do WPF do seu processador XAML é inerentemente ciente de propriedade de dependência. O processador XAML do WPF utiliza métodos do sistema de propriedade para propriedades de dependência ao carregar XAML binários e atributos de processamento que são propriedades de dependência. Isso efetivamente contorna wrappers de propriedade. Quando você implementa propriedades de dependência personalizadas, você deve considerar esse comportamento e evitar colocar qualquer outro código no seu wrapper de propriedade diferente dos métodos de sistema de propriedade GetValue e SetValue.

Este tópico contém as seguintes seções.

  • Pré-requisitos
  • A Implementação do Loader XAML do WPF e Desempenho
  • Implicações para Propriedades de Dependência Personalizadas
  • Tópicos relacionados

Pré-requisitos

Este tópico assume que você entenda propriedades de dependência tanto como consumidor quanto como autor e ter lido Visão geral sobre propriedades de dependência e Propriedades de Dependência Personalizada. Você também deveria ter lido XAML Overview e Terminologia de sintaxe XAML.

A Implementação do Loader XAML do WPF e Desempenho

Por motivos de implementaçao, é computacionalmente mais barato identificar uma propriedade como uma propriedade de dependência e acessar o método SetValue do sistema de propriedades para defini-la em vez de utilizar o wrapper da propriedade e seu setter. Isso é porque um processador XAML deve inferir todo o modelo de objeto para o código baseado apenas em conhecer o tipo e os relacionamentos de membros indicados pela estrutura da marcação e vários strings.

O tipo é buscado através de uma combinação de xmlns e atributos de assembly, mas identificando os membros, determinando quais poderiam suportar serem definidos como um atributo e resolvendo que tipos de suporte a valores de propriedades requeririam reflexão extensiva utilizando PropertyInfo. Porque as propriedades de dependência de um dado tipo são acessíveis como uma tabela de armazenamento através do sistema de propriedades, a implementação do WPF do seu processador XAML utiliza essa tabela e infere que qualquer dada proprieade ABC pode ser definida de forma mais eficiente chamando SetValue no tipo derivado DependencyObject que a contém, utilizando o identificador de propriedade de dependência ABCProperty.

Implicações para Propriedades de Dependência Personalizadas

Porque a implementação atual do WPF do comportamento do processador XAML para definição de propriedades contorna os wrappers inteiramente, você não deveria colocar nenhuma lógica adicional nas definições estabelecidas no wrapper para sua propriedade de dependência personalizada. Se você colocar uma lógica assim na definição do set, então a lógica não será executada quando a propriedade for definida em XAML em vez de no código.

De forma semelhante, outros aspectos do processador XAML que obtêm valores de propriedades do processamento XAML também utilizam GetValue em vez do wrapper. Portanto, você deve evitar qualquer implementação adicional na definição do get além da chamada GetValue.

The following example is a recommended dependency property definition with wrappers, where the property identifier is stored as a public static readonly field, and the get and set definitions contain no code beyond the necessary property system methods that define the dependency property backing.

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); }
}

Consulte também

Conceitos

Visão geral sobre propriedades de dependência

XAML Overview

Metadados de Propriedade de Dependência

Propriedade de Dependência de Tipos de Coleção

Segurança de Propriedades de Dependência

Safe Constructor Patterns for DependencyObjects