2013-08-13 8 views
13

Ich versuche, die Metadaten von ItemsControl.ItemsSourceProperty in einer abgeleiteten Klasse, um außer Kraft zu setzen meinen eigenen Rückruf zuweisen:Metadaten überschreiben und die Basis von Metadaten vom gleichen Typ sein muß

public class CustomDataGrid : System.Windows.Controls.DataGrid 
{ 
    static CustomDataGrid() 
    { 
     CustomDataGrid.ItemsSourceProperty.OverrideMetadata(typeof(CustomDataGrid), new UIPropertyMetadata(new PropertyChangedCallback(OnItemsSourcePropertyChanged))); 
    } 

    private static void OnItemsSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    {} 
} 

ich einen Designer + Laufzeitausnahme:

Metadata override and base metadata must be of the same type 

Was mache ich falsch?

Antwort

24

Sie müssen FrameworkPropertyMetadata verwenden. Alle Elemente, die mit WPF geliefert werden, die von FrameworkElement (und DataGrid) stammen, verwenden es als ihre Metadaten.

+0

Ich arbeite mit 'SnapsToDevicePixesProperty'. Wenn ich den Code dekompiliere, sehe ich, dass er anfänglich mit einem einfachen alten 'PropertyMetadata' registriert wurde. Wenn ich es jedoch zur Laufzeit im Debugger überprüfe, sehe ich zwei Einträge in seiner '_metadataMap' - einem' PropertyMetadata' und einem 'FrameworkPropertyMetadata'. Anscheinend fügt das Framework irgendwo einen zusätzlichen Besitzer hinzu? Heißt das, die Regel besagt, dass beim Hinzufügen eines Eigentümers der Eigenschaft Ihr Metadatentyp mit dem * am meisten abgeleiteten Typ *, der bereits registriert ist, übereinstimmen oder von diesem abgeleitet sein muss? – dlf

+0

Ich denke, das wäre eine sichere Annahme. Andernfalls würde die Klasse, die das 'FrameworkPropertyMetadata'registrierte, beim Zugriff auf ihre Metadaten eine Ausnahme haben. –

+0

Sinnvoll (ich würde wieder +1 geben, aber ich habe schon eine Weile zurück) – dlf