我已经构建了一个UserControl
,用于为所选颜色选择Color
DependencyProperty
,以及CoerceValueCallback
,以确保所选颜色完全不透明且完全不透明亮。如果我将此控件添加到窗口,并将窗口的背景颜色绑定到控件的选定颜色属性,一切都按预期工作。我可以使用按钮将“坏”颜色推入控件,但值强制逻辑确保存储“有效”颜色,控件和窗口背景都显示“有效”颜色而不是“坏”颜色推进了。
但是,如果我尝试在具有自己的UserControl
的另一个DependencyProperty
中使用此控件来选择颜色,并使用双向绑定将两者连接在一起,则值强制逻辑不会按照我的预期工作。无论内部控件上发生的任何值强制如何,外部控件都会保持被推入其中的“坏”颜色。
有没有办法强制内部控件的强制值同步回外部控件,而不必在外部控件上重新实现值强制逻辑?
答案 0 :(得分:1)
我不认为强制强制值可以同步回来。 WPF 会跟踪绑定更新操作,并阻止可能导致意外和/或意外行为的操作。并且同步肯定有可能使事情变得非常糟糕,例如如果你的外部控件会实现强制逻辑,允许一组值与内部控件允许的值集不相交,那么你最终会陷入无休止地强制来回传递值。
现在有几种方法可以解决您的问题:
<强> 1 强>
您可以检查内部控件中属性更改回调中的值,而不是使用强制机制,如果原始值无效,则再次设置它。如果我没记错,虽然由于上述 WPF 安全机制(在执行该属性时属性发生变化而忽略了更改回调),您必须使用Dispatcher
,但我可能错了。然而,我不推荐这种方法。
<强> 2 强>
如果外部控件属性的目的只是暴露内部控件属性,那么最好的办法是使用DependencyProperty.AddOwner
方法而不是静态DependencyProperty.Register
方法在外部注册属性控制。
第3 强>
否则,您可以将强制逻辑提取到静态方法,并简单地将其用于内部和外部控制的属性强制。这样你就不需要重新实现逻辑了。