元数据覆盖和基础元数据必须属于同一类型

Posted

技术标签:

【中文标题】元数据覆盖和基础元数据必须属于同一类型【英文标题】:Metadata override and base metadata must be of the same type 【发布时间】:2013-08-15 02:49:24 【问题描述】:

我试图在派生类中覆盖 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

我做错了什么?

【问题讨论】:

【参考方案1】:

您需要使用FrameworkPropertyMetadata。 WPF 附带的所有源自FrameworkElement(和DataGrid)的元素都使用它作为它们的元数据。

【讨论】:

我正在与SnapsToDevicePixesProperty 合作。如果我反编译代码,我会看到它最初是用普通的旧 PropertyMetadata 注册的。但是,如果我在运行时在调试器中检查它,我会在其_metadataMap 中看到两个条目——一个PropertyMetadata 和一个FrameworkPropertyMetadata。显然框架在某处增加了一个额外的所有者?这是否暗示规则是,在添加属性所有者时,您的元数据类型必须匹配或派生自已注册的派生最多的类型 我认为这是一个安全的假设。否则,注册FrameworkPropertyMetadata 的类在尝试访问其元数据时会出现异常

以上是关于元数据覆盖和基础元数据必须属于同一类型的主要内容,如果未能解决你的问题,请参考以下文章

2021年大数据常用语言Scala(十五):基础语法学习 元组  重点掌握

Python学习之路——Python基础之基本数据类型(列表元组和字典)

基础知识复习

Olingo Odata v4 - 从模型生成类型、集合和元数据

python基础04--基本数据类型(列表元组字典)

Python冷知识之命名元组