WPF嵌套依赖属性值强制

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

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

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


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

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

1。

您可以使用强制机制来检查内部控件中属性已更改回调的值,并在原始值无效时重新进行设置。 如果我记得,虽然由于所述的WPF安全机制(属性更改,而执行该属性的变更回调被忽略),你不得不使用Dispatcher ,但我可能是错误的。 不过,我不推荐这种方法。

2。

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

3。

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

链接地址: http://www.djcxy.com/p/67575.html

上一篇: WPF Nested DependencyProperty Value Coercion

下一篇: How to propagate PropertyChanged changes in DependencyProperty