Dela via


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