Carregamento de XAML e Propriedades de Dependência
A implementação WPF atual de seu processador XAML é inerentemente consciente da propriedade de dependência. O processador WPF XAML usa métodos de sistema de propriedades para propriedades de dependência ao carregar XAML binário e processar atributos que são propriedades de dependência. Isso efetivamente dá a volta aos envoltórios de propriedades. Ao implementar propriedades de dependência personalizadas, você deve levar em conta esse comportamento e deve evitar colocar qualquer outro código em seu wrapper de propriedade diferente dos métodos do sistema de propriedades GetValue e SetValue.
Pré-requisitos
Este tópico pressupõe que você compreenda as propriedades de dependência como consumidor e autor e tenha lido Visão geral das propriedades de dependência e Propriedades de dependência personalizadas. Você também deve ter lido XAML no WPF e Sintaxe XAML em detalhes.
A implementação e o desempenho do carregador WPF XAML
Por motivos de implementação, é computacionalmente mais barato identificar uma propriedade como uma propriedade de dependência e aceder ao método do sistema de propriedades SetValue para defini-la, em vez de usar o invólucro de propriedade e o seu definidor. Isso ocorre porque um processador XAML deve inferir todo o modelo de objeto do código de suporte com base apenas no conhecimento das relações de tipo e membro indicadas pela estrutura da marcação e várias cadeias de caracteres.
O tipo é pesquisado por meio de uma combinação de xmlns e atributos de assembly, mas identificar os membros, determinar quais poderiam ser atribuídos como atributos e determinar que tipos os valores das propriedades suportam de outra forma exigiria uma reflexão extensiva usando PropertyInfo. Como as propriedades de dependência em um determinado tipo são acessíveis como uma tabela de armazenamento por meio do sistema de propriedades, a implementação WPF de seu processador XAML usa essa tabela e infere que qualquer propriedade determinada ABC pode ser definida de forma mais eficiente chamando SetValue no tipo derivado de DependencyObject que contém, usando o identificador de propriedade de dependência ABCProperty.
Implicações para propriedades de dependência personalizadas
Como a implementação WPF atual do comportamento do processador XAML para a configuração de propriedade ignora totalmente os wrappers, você não deve colocar nenhuma lógica adicional nas definições definidas do wrapper para sua propriedade de dependência personalizada. Se você colocar essa lógica na definição definida, a lógica não será executada quando a propriedade for definida em XAML em vez de em código.
Da mesma forma, outros componentes do processador XAML que obtêm valores de propriedade do processamento de XAML também usam GetValue em vez de utilizarem o wrapper. Portanto, você também deve evitar qualquer implementação adicional na definição de get
além da chamada GetValue.
O exemplo a seguir é uma definição recomendada de propriedade de dependência com encapsuladores, onde o identificador de propriedade é armazenado como um campo public
static
readonly
, e as definições de get
e set
não contêm nenhum código além dos métodos do sistema de propriedades necessários para definir o suporte da propriedade de dependência.
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
Ver também
- Visão geral das propriedades de dependência
- XAML no WPF
- Metadados de Propriedade de Dependência
- Collection-Type Propriedades de dependência
- Segurança da Propriedade de Dependência
- Padrões de construtor seguros para DependencyObjects
.NET Desktop feedback