2013-08-13 15 views
13

sto cercando di ignorare i metadati di ItemsControl.ItemsSourceProperty in una classe derivata, al fine di assegnare il mio callback:metadati di override e di base dei metadati devono essere dello stesso tipo

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) 
    {} 
} 

ho un progettista + eccezione di runtime:

Metadata override and base metadata must be of the same type 

Cosa sto facendo male?

risposta

24

È necessario utilizzare FrameworkPropertyMetadata. Tutti gli elementi forniti con WPF che derivano da FrameworkElement (e da DataGrid) lo utilizzano come metadati.

+0

Sto lavorando con 'SnapsToDevicePixesProperty'. Se decompilisco il codice, vedo che è inizialmente registrato con plain 'PropertyMetadata'. Tuttavia, se lo controllo nel debugger in fase di esecuzione, vedo due voci nel suo '_metadataMap' - un' PropertyMetadata' e un 'FrameworkPropertyMetadata'. Apparentemente la struttura aggiunge un altro proprietario da qualche parte? Ciò implica che, quando si aggiunge un proprietario, il tipo di metadati deve corrispondere o derivare dal tipo * più derivato * già registrato? – dlf

+0

Penso che sarebbe un'ipotesi sicura. Altrimenti, la classe che ha registrato il 'FrameworkPropertyMetadata' avrebbe un'eccezione quando tentava di accedere ai suoi metadati –

+0

Ha senso (farei di nuovo +1, ma ho già fatto un po 'di tempo fa) – dlf