WPF嵌套DependencyProperty值强制

时间:2017-01-27 20:18:00

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

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

但是,如果我尝试在具有自己的UserControl的另一个DependencyProperty中使用此控件来选择颜色,并使用双向绑定将两者连接在一起,则值强制逻辑不会按照我的预期工作。无论内部控件上发生的任何值强制如何,外部控件都会保持被推入其中的“坏”颜色。

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

1 个答案:

答案 0 :(得分:1)

我不认为强制强制值可以同步回来。 WPF 会跟踪绑定更新操作,并阻止可能导致意外和/或意外行为的操作。并且同步肯定有可能使事情变得非常糟糕,例如如果你的外部控件会实现强制逻辑,允许一组值与内部控件允许的值集不相交,那么你最终会陷入无休止地强制来回传递值。

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

<强> 1

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

<强> 2

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

第3

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