【问题标题】:WPF Nested DependencyProperty Value CoercionWPF嵌套依赖属性值强制
【发布时间】:2017-01-27 20:18:00
【问题描述】:

我构建了一个UserControl 用于选择Color 和一个DependencyProperty 用于选定颜色,以及一个CoerceValueCallback 确保选定颜色完全不透明且完全明亮。如果我将此控件添加到窗口,并将窗口的背景颜色绑定到控件的选定颜色属性,则一切都按预期工作。我可以使用按钮将“坏”颜色推送到控件中,但是值强制逻辑确保存储“有效”颜色,并且控件和窗口背景都显示“有效”颜色而不是“坏”颜色被推进去的。

但是,如果我尝试在另一个 UserControl 中使用此控件,该控件具有自己的 DependencyProperty 用于选定颜色,并使用双向绑定将两者连接在一起,则值强制逻辑不起作用我预计。外部控件保留被推入其中的“坏”颜色,而不管内部控件上发生的任何值强制。

有没有办法强制内部控件的强制值同步回外部控件,而不必在外部控件上重新实现值强制逻辑?

【问题讨论】:

    标签: c# wpf data-binding user-controls dependency-properties


    【解决方案1】:

    我认为不可能强制强制值同步回来。 WPF 跟踪绑定更新操作并防止可能导致不需要和/或意外行为的操作。并且同步回来肯定有可能使事情变得非常糟糕,例如如果您的外部控件将实现强制逻辑,该逻辑将允许一组值与内部控件允许的一组值不相交,那么您最终将陷入一个来回强制值的无限循环。

    现在有几种方法可以解决您的问题:

    1.

    您可以检查内部控件中属性更改回调中的值,如果原始值无效,则重新设置它,而不是使用强制机制。如果我没记错的话,由于上述 WPF 安全机制(在执行该属性的更改回调时属性更改被忽略),您必须使用Dispatcher,但我可能错了。不过我不推荐这种方法。

    2.

    如果外部控件属性的目的只是为了暴露内部控件属性,最好的办法是使用DependencyProperty.AddOwner 方法而不是静态DependencyProperty.Register 方法在外部控件上注册属性。

    3.

    否则,您可以将强制逻辑提取到静态方法中,然后简单地将其用于内部和外部控件的属性强制。这样你就不需要重新实现逻辑了。

    【讨论】:

    • DependencyProperty.AddOwner 听起来像我需要的,但我仍然必须在内部和外部控件上实现值强制回调才能使其工作。我将实际的强制逻辑移到内部控件上的公共静态方法中,这样至少代码不会重复。
    猜你喜欢
    • 2011-08-19
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    相关资源
    最近更新 更多