如何在WPF中清除SetCurrentValue设置的值?

7

对于一个DependencyProperty,我使用DependencyObject.SetCurrentValue(property, value)设置了一个值。如何取消该值,使属性重新评估为普通的本地值?

您可以使用DependencyObject.ClearValue(property)方法来清除当前值并恢复为默认值。

2个回答

17

调用InvalidateProperty将强制重新评估该值,它似乎忽略了“当前”值,因此它有效地将其取消设置。


3
这绝对是一个更好的解决方案,因为看起来 WPF 已经跟踪了先前的值,即使它没有数据绑定。 - reSPAWNed
当未分配绑定时,InvalidateProperty 仅将值还原回去。当有绑定时,当前值不再是“临时”的,因为它立即进入绑定源。现在,绑定源提供新值。因此,在调用 InvalidateProperty 时,它会更新绑定源。 - white.zaz
@white.zaz,使用SetCurrentValue时不是这样的。请注意,这与在属性赋值时调用的常规SetValue不同。SetCurrentValue不会更新绑定源。 - nmclean
@nmclean SetCurrentValue会更新绑定源。我为您创建了一个小例子 https://www.dropbox.com/s/olotsz8muzdfrl4/SetCurrentValueTest.zip?dl=0 - white.zaz
从MSDN: "SetCurrentValue - 在不更改其值源的情况下设置依赖属性的值。" 我相信你误解了'绑定源'和'值源'之间的区别。 - white.zaz
@white.zaz 我明白你的意思。在你最初的评论中,你应该说“只有在没有源更新时才会发生”。它不会恢复到你的示例中的原因不是因为有一个绑定分配,而是因为它是一个TwoWay绑定,它在每个目标属性更改时更新源。然而,所有源到目标绑定都将起作用。 - nmclean

-2
我不相信你可以“取消”这个值;你只能将该值“重置”为先前保存的值。如果你没有那个值,那么你就没办法了... -- Tejs 我也认为没有其他方法。这种方法会改变值而不是在优先级列表中添加覆盖。在覆盖之前获取该值并将其存储在某个地方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接