WPF 嵌套依赖项属性值强制



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

但是,如果我尝试在另一个UserControl中使用此控件,该控件具有自己的所选颜色DependencyProperty,并使用双向绑定将两者连接在一起,则值强制逻辑无法按预期工作。外部控件保留推送到其中的"坏"颜色,而不考虑内部控件上发生的任何值强制。

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

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

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

1.

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

阿拉伯数字。

如果外部控件属性的用途只是公开内部控件属性,则最好的办法是使用DependencyProperty.AddOwner方法而不是静态DependencyProperty.Register方法来注册外部控件上的属性。

3.

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

最新更新