c# - 如何在非静态构造函数中覆盖 DataContextProperty 元数据
问题描述
我需要在 ContentControl 中覆盖 DataContextProperty 的元数据以关联 PropertyChangedCallback。
据我所知,这只允许在静态构造函数中,但 PropertyChangedCallback 不能是静态函数。有没有更好的方法来实现这一目标?
静态 cunstructor:
static ListAndDetailsControl() {
DataContextProperty.OverrideMetadata(typeof(ListAndDetailsControl), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnDataContextChanged)));
}
应该在属性更改时调用的函数:
private void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {}
解决方案
OverrideMetadata
在静态构造函数中不能是强制性的(但它应该在那里)。您可以将它放在例如Button.Click
事件处理程序中。
PropertyChangedCallback 不能是静态函数
这是错的。PropertyChangedCallback 可以是静态函数。
问题是,如果有人已经注册/覆盖了属性的元数据,那么你会得到一个异常。
参见MSDN:
此外,元数据只能被每种类型覆盖一次。随后尝试覆盖相同类型的元数据将引发异常。
要跟踪 DataContext 上的更改,只需使用适当的 event ContentControl.DataContextChanged
。
<ContentControl DataContextChanged="OnDataContextChanged">
为了避免后面的代码使用行为处理DataContextChanged
。
推荐阅读
- java - 在到达`return`语句之前调用返回:Java-Android
- java - 使用 SFTP Inbound 重新下载本地删除的文件的程序是什么
- function - 使用函数比较整数并找到一个值为偶数而另一个值为奇数的位置 c++
- python - python 上带有“空格”的 vigenere 加密问题
- orocommerce - 没有任何实体别名的 OroPlatform
- azure - Azure 流 URL 有效性
- ios - 我试图通过比较另一个字典中的键来更改一个字典中的值
- dynamics-crm - Dynamics CRM 错误:无法更新对象,因为在关闭电话时它是只读的
- mysql - 如何从同一张表中查询城市名称以及最小城市名称的长度
- google-sheets - 将谷歌表格中的复选框链接到另一个表格?