Anvisningar: Åsidosätt metadata för en beroendeegenskap
Det här exemplet visar hur du åsidosätter standardmetadata för beroendeegenskap som kommer från en ärvd klass genom att anropa metoden OverrideMetadata och tillhandahålla typspecifika metadata.
Exempel
Genom att definiera dess PropertyMetadatakan en klass definiera beroendeegenskapens beteenden, till exempel dess standardvärde och återanrop till egenskapssystemet. Många beroendeegenskapsklasser har redan standardmetadata som upprättats som en del av registreringsprocessen. Detta inkluderar beroendeegenskaperna som ingår i WPF-API:et. En klass som ärver beroendeegenskapen genom dess klassarv kan åsidosätta de ursprungliga metadata så att egenskaperna för egenskapen som kan ändras via metadata matchar eventuella underklassspecifika krav.
Att åsidosätta metadata för en beroendeegenskap måste ske innan egenskapen tas i bruk av egenskapssystemet, vilket innebär när specifika instanser av objekt som registrerat egenskapen skapas. Anrop till OverrideMetadata måste utföras inom statiska konstruktorer av den typ som tillhandahåller sig själv som forType
-parametern för OverrideMetadata. Om du försöker ändra metadata när det finns instanser av ägartypen genereras inga undantag, men det resulterar i inkonsekventa beteenden i egenskapssystemet. Metadata kan också bara åsidosättas en gång per typ. Efterföljande försök att åsidosätta metadata på samma typ skapar ett undantag.
I följande exempel åsidosätter den anpassade klassen MyAdvancedStateControl
metadata som tillhandahålls för StateProperty
av MyStateControl
med nya egenskapsmetadata. Till exempel är standardvärdet för StateProperty
nu true
när egenskapen efterfrågas på en nyligen konstruerad MyAdvancedStateControl
instans.
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 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 : MyStateControl
{
public MyAdvancedStateControl() : base() { }
static MyAdvancedStateControl()
{
MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
}
}
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
Se även
.NET Desktop feedback