Attached property
De Banane Atomic
Aller à la navigationAller à la recherche
Définition
Une attached property est un type de dependency property.
L'AP est définit dans une classe statique pour pouvoir ensuite être attachée à un DependencyObject.
Utilisé principalement pour décorer un élément avec des métadata qui seront utilisé par un autre élément pour le layout. Ex: Grid.Row.
Example
DockPanel.Dock est conçue pour être définie sur les éléments contenus dans un DockPanel, plutôt que sur le DockPanel proprement dit.
[AttachedPropertyBrowsableForChildren] public static Dock GetDock(UIElement element) { if (element == null) { throw new ArgumentNullException("element"); } return (Dock)element.GetValue(DockPanel.DockProperty); } public static void SetDock(UIElement element, Dock dock) { if (element == null) { throw new ArgumentNullException("element"); } element.SetValue(DockPanel.DockProperty, dock); } [CommonDependencyProperty] public static readonly DependencyProperty DockProperty = DependencyProperty.RegisterAttached( "Dock", typeof(Dock), typeof(DockPanel), new FrameworkPropertyMetadata( Dock.Left, new PropertyChangedCallback(DockPanel.OnDockChanged)), new ValidateValueCallback(DockPanel.IsValidDock)); |
snippet propa
public static int GetMyProperty(DependencyObject obj) { return (int)obj.GetValue(MyPropertyProperty); } public static void SetMyProperty(DependencyObject obj, int value) { obj.SetValue(MyPropertyProperty, value); } public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.RegisterAttached( "MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0)); |
Code
MyAttachedProperty.cs |
// les attached properties sont définies dans des classes à part. public static class MyAttachedProperty { public static string GetText(DependencyObject obj) { return (string) obj.GetValue(TextProperty); } public static void SetText(DependencyObject obj, string value) { obj.SetValue(TextProperty, value); } public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached( "Text", typeof(string), typeof(MyAttachedProperty), new PropertyMetadata("", OnTextChanged)); // valeur par défaut et change handler // le change handler n'est appelé que si la valeur a changé (différente de la valeur précédente) private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // d: DependencyObject sur lequel l'attached propety a été définie if (d is TextBlock tb) { tb.Text = (string)e.NewValue; } } } |
MyWindow.xaml |
<TextBlock local:MyAttachedProperty.Text="text" /> |