2013-08-13 10 views
13

私は自分のコールバック割り当てるために、派生クラスでItemsControl.ItemsSourcePropertyのメタデータを上書きしようとしている:私はデザイナーを取得メタデータのオーバーライドやベースのメタデータは、同じタイプでなければなりません

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

を+ランタイム例外:

Metadata override and base metadata must be of the same type 

私は間違っていますか?

答えて

24

FrameworkPropertyMetadataを使用する必要があります。 FrameworkElement(およびDataGrid)から派生したWPFに付属するすべての要素は、そのメタデータとして使用します。

+0

私は 'SnapsToDevicePixesProperty'を使っています。コードを逆コンパイルすると、最初は普通の 'PropertyMetadata'で登録されています。しかし、実行時にデバッガでそれを調べると、 '_metadataMap'には2つのエントリがあります。これは' PropertyMetadata'と 'FrameworkPropertyMetadata'です。どうやら、フレームワークはどこか別の所有者を追加しますか?これは、プロパティ所有者を追加するときに、メタデータタイプが既に登録されている*派生タイプ*と一致するか、またはそれから派生しなければならないという規則を暗示していますか? – dlf

+0

私はこれが安全な前提だと思います。それ以外の場合は、 'FrameworkPropertyMetadata'を登録したクラスは、そのメタデータにアクセスしようとすると例外が発生します。 –

+0

意味があります(もう一度+1しますが、 – dlf

関連する問題