Procedura: eseguire l'override dei metadati per una proprietà di dipendenza
In questo esempio viene mostrato come eseguire l'override dei metadati delle proprietà di dipendenza predefiniti che provengono da una classe ereditata, chiamando il metodo OverrideMetadata e fornendo metadati specifici del tipo.
Esempio
Tramite la definizione del relativo oggetto PropertyMetadata, una classe può specificare i comportamenti della proprietà di dipendenza, ad esempio il valore predefinito e i callback del sistema di proprietà. Molte classi della proprietà di dipendenza dispongono già di metadati predefiniti stabiliti come parte del processo di registrazione. Sono incluse le proprietà di dipendenza che fanno parte delle API WPF. Una classe che eredita la proprietà di dipendenza tramite l'ereditarietà di classe può eseguire l'override dei metadati originali in modo che le caratteristiche della proprietà che è possibile modificare tramite i metadati soddisfino qualsiasi requisito specifico della sottoclasse.
L'override dei metadati di una proprietà di dipendenza deve essere eseguito prima che la proprietà venga resa utilizzabile dal sistema di proprietà, ovvero nel momento in cui vengono create istanze specifiche degli oggetti che registrano la proprietà. Le chiamate a OverrideMetadata devono essere eseguite all'interno dei costruttori statici del tipo che fornisce se stesso come parametro forType di OverrideMetadata. Il tentativo di modificare i metadati dopo la creazione delle istanze del tipo di proprietario non genererà eccezioni, ma darà come risultato comportamenti incoerenti nel sistema della proprietà. Inoltre, l'override di metadati può essere eseguito solo una volta per tipo. I successivi tentativi di eseguire l'override dei metadati sullo stesso tipo genereranno un'eccezione.
Nell'esempio seguente, la classe personalizzata MyAdvancedStateControl esegue l'override dei metadati forniti per StateProperty da MyAdvancedStateControl con i nuovi metadati delle proprietà. Ad esempio, il valore predefinito di StateProperty sarà true quando viene eseguita una query sulla proprietà in un'istanza MyAdvancedStateControl appena creata.
Public Class MyStateControl
Inherits ButtonBase
Public Sub New()
MyBase.New()
End Sub
Public Property State() As Boolean
Get
Return CType(Me.GetValue(StateProperty), Boolean)
End Get
Set(ByVal value As Boolean)
Me.SetValue(StateProperty, value)
End Set
End Property
Public Shared ReadOnly StateProperty As DependencyProperty = DependencyProperty.Register("State", GetType(Boolean), GetType(MyStateControl),New PropertyMetadata(False))
End Class
...
Public Class MyAdvancedStateControl
Inherits MyStateControl
Public Sub New()
MyBase.New()
End Sub
Shared Sub New()
MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
End Sub
End Class
public class MyStateControl : ButtonBase
{
public MyStateControl() : base() { }
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
"State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}
...
public class MyAdvancedStateControl : MyStateControl
{
public MyAdvancedStateControl() : base() { }
static MyAdvancedStateControl()
{
MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
}
}
Vedere anche
Riferimenti
Concetti
Cenni preliminari sulle proprietà di dipendenza
Proprietà Dependency personalizzate