WPF 嵌套依赖属性值强制

WPF Nested DependencyProperty Value Coercion

我构建了一个 UserControl 用于选择一个 Color,一个 DependencyProperty 用于选定的颜色,一个 CoerceValueCallback 用于确保选定的颜色完全不透明并且完全明亮。如果我将此控件添加到 window,并将 window 的背景色绑定到控件的选定颜色 属性,一切都会如我所料。我可以使用按钮将 "bad" 颜色推送到控件中,但是值强制逻辑确保 "valid" 颜色被存储,并且控件和 window 背景都显示 "valid" 颜色,而不是推入的 "bad" 颜色。

但是,如果我尝试在另一个 UserControl 中使用此控件,它有自己的 DependencyProperty 用于选定的颜色,并使用双向绑定将两者连接在一起,值强制逻辑不符合我的预期。外部控件保留推入其中的 "bad" 颜色,而不管内部控件上发生的任何值强制转换。

有没有一种方法可以强制将来自内部控件的强制值同步回外部控件,而无需在外部控件上也重新实现值强制逻辑?

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

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

1.

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

2.

如果外部控件 属性 的目的只是公开内部控件 属性,您最好的选择是使用 DependencyProperty.AddOwner 方法而不是静态 [=12] =]方法在外部控件上注册属性。

3.

否则,您可以将强制转换逻辑提取到静态方法中,并简单地将其用于内部和外部控件的 属性 强制转换。这样你就不需要re-implement逻辑。