Carregando XAML e Propriedades de Dependência
O atual WPF a implementação de sua XAML processador inerentemente está ciente de propriedade de dependência. O WPF XAML processador usa os métodos do sistema de propriedade para propriedades de dependência ao carregar o binário XAML e processamento de atributos que são propriedades de dependência. This effectively bypasses the property wrappers. When you implement custom dependency properties, you must account for this behavior and should avoid placing any other code in your property wrapper other than the property system methods GetValue and SetValue.
Este tópico contém as seguintes seções.
- Prerequisites
- The WPF XAML Loader Implementation, and Performance
- Implications for Custom Dependency Properties
- Tópicos relacionados
Prerequisites
This topic assumes that you understand dependency properties both as consumer and author and have read Visão geral sobre propriedades de dependência and Propriedades de Dependência Personalizada. You should also have read Visão geral do XAML (WPF) and Sintaxe XAML em detalhes.
The WPF XAML Loader Implementation, and Performance
For implementation reasons, it is computationally less expensive to identify a property as a dependency property and access the property system SetValue method to set it, rather than using the property wrapper and its setter. Isso ocorre porque um XAML processador deve interpretar o modelo de objeto de todo o código de backup com base apenas em saber o tipo e membro relacionamentos que são indicados pela estrutura de marcação e várias seqüências de caracteres.
The type is looked up through a combination of xmlns and assembly attributes, but identifying the members, determining which could support being set as an attribute, and resolving what types the property values support would otherwise require extensive reflection using PropertyInfo. Como propriedades de dependência em um determinado tipo são acessíveis como uma tabela de armazenamento através do sistema de propriedade, o WPF implementação de sua XAML processador usa esta tabela e infere que qualquer dada propriedade ABC pode ser definida com mais eficiência, chamando SetValue em que o contém DependencyObject derivado do tipo, usando o identificador de propriedade de dependência ABCProperty.
Implications for Custom Dependency Properties
Porque o atual WPF implementação do XAML o comportamento de processadores para configuração da propriedade ignora os invólucros totalmente, você não deve colocar qualquer lógica adicional para as definições do conjunto do wrapper para a propriedade de dependência personalizadas. Se você coloca tal lógica na definição de conjunto, a lógica não será executada quando a propriedade é definida XAML em vez de código.
Da mesma forma, outros aspectos do XAML processador que obter valores de propriedade de XAML também usar o processamento GetValue em vez de usar o wrapper. Therefore, you should also avoid any additional implementation in the get definition beyond the GetValue call.
O exemplo a seguir é uma definição de propriedade de dependência recomendada com invólucros, onde o identificador de propriedade é armazenado como um public static readonly campo e o get e set definições não contêm nenhum código além os métodos do sistema de propriedade necessária que definem o apoio de propriedade de dependência.
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
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
Metadados de Propriedade de Dependência
Propriedade de Dependência de Tipos de Coleção