【问题标题】:How to override DataContextProperty metadata in non static constructor如何在非静态构造函数中覆盖 DataContextProperty 元数据
【发布时间】:2019-01-17 09:25:13
【问题描述】:

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

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

静态构造函数:

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

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

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

【问题讨论】:

    标签: c# wpf dependency-properties


    【解决方案1】:

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

    PropertyChangedCallback 不能是静态函数

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

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

    MSDN:

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

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

    <ContentControl DataContextChanged="OnDataContextChanged">
    

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

    【讨论】:

    • 我是一只头晕目眩的山羊。当然 PropertyChangedCallback 可以是静态的。我错了。
    猜你喜欢
    • 2011-07-20
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多