元数据覆盖和基础元数据必须属于同一类型
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基础之基本数据类型(列表元组和字典)