2013-08-13 16 views
13

Tôi đang cố gắng để ghi đè các siêu dữ liệu của ItemsControl.ItemsSourceProperty trong một lớp học có nguồn gốc để gán callback của riêng tôi:Metadata ghi đè và cơ sở siêu dữ liệu phải cùng loại

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

tôi nhận được một nhà thiết kế + ngoại lệ thời gian chạy:

Metadata override and base metadata must be of the same type 

Tôi đang làm gì sai?

Trả lời

24

Bạn cần sử dụng FrameworkPropertyMetadata. Tất cả các yếu tố đi kèm với WPF có nguồn gốc từ FrameworkElement (và DataGrid hiện) sử dụng nó làm siêu dữ liệu của chúng.

+0

Tôi đang làm việc với 'SnapsToDevicePixesProperty'. Nếu tôi dịch ngược mã, tôi thấy rằng ban đầu nó đã được đăng ký với 'PropertyMetadata' thuần cũ. Tuy nhiên, nếu tôi kiểm tra nó trong trình gỡ rối khi chạy, tôi thấy hai mục trong '_metadataMap' - một' PropertyMetadata' và 'FrameworkPropertyMetadata'. Rõ ràng khuôn khổ thêm một chủ sở hữu bổ sung ở đâu đó? Điều này có ngụ ý quy tắc là, khi thêm chủ sở hữu sản phẩm, loại siêu dữ liệu của bạn phải khớp hoặc lấy được từ * loại có nguồn gốc nhiều nhất * đã được đăng ký? – dlf

+0

Tôi nghĩ rằng đó sẽ là một giả định an toàn. Nếu không, lớp đã đăng ký 'FrameworkPropertyMetadata' sẽ có ngoại lệ khi cố gắng truy cập vào siêu dữ liệu của nó –

+0

Làm cho tinh thần (tôi muốn +1 một lần nữa, nhưng tôi đã làm một lúc trở lại) – dlf

Các vấn đề liên quan