如何在非静态构造函数中重写DataContextProperty元数据

时间:2019-01-17 09:25:13

标签: c# wpf dependency-properties

我需要在ContentControl中重写DataContextProperty的元数据,以关联PropertyChangedCallback。

我知道这仅在静态构造函数中允许,但PropertyChangedCallback不能是静态函数。 有没有更好的方法可以做到这一点?

静态构造函数:

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

应在属性上调用的函数已更改:

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

1 个答案:

答案 0 :(得分:1)

OverrideMetadata在静态构造函数中必须不是必需的(但应该在其中)。你可以把它例如在Button.Click事件处理程序中。

  

PropertyChangedCallback不能是静态函数

错了。 PropertyChangedCallback可以是静态函数。

问题在于,如果有人已经注册/覆盖了该属性的元数据,那么您将获得一个例外。

请参见MSDN:

  

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

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

<ContentControl DataContextChanged="OnDataContextChanged">

为避免代码落后,请使用行为处理DataContextChanged