首页 > 解决方案 > 如何在非静态构造函数中覆盖 DataContextProperty 元数据

问题描述

我需要在 ContentControl 中覆盖 DataContextProperty 的元数据以关联 PropertyChangedCallback。

据我所知,这只允许在静态构造函数中,但 PropertyChangedCallback 不能是静态函数。有没有更好的方法来实现这一目标?

静态 cunstructor:

static ListAndDetailsControl() {    
DataContextProperty.OverrideMetadata(typeof(ListAndDetailsControl), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnDataContextChanged)));
}

应该在属性更改时调用的函数:

private void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {}

标签: c#wpfdependency-properties

解决方案


OverrideMetadata在静态构造函数中不能是强制性的(但它应该在那里)。您可以将它放在例如Button.Click事件处理程序中。

PropertyChangedCallback 不能是静态函数

这是错的。PropertyChangedCallback 可以是静态函数。

问题是,如果有人已经注册/覆盖了属性的元数据,那么你会得到一个异常。

参见MSDN:

此外,元数据只能被每种类型覆盖一次。随后尝试覆盖相同类型的元数据将引发异常。

要跟踪 DataContext 上的更改,只需使用适当的 event ContentControl.DataContextChanged

<ContentControl DataContextChanged="OnDataContextChanged">

为了避免后面的代码使用行为处理DataContextChanged


推荐阅读