依赖属性SetValue()和SetCurrentValue()之间有什么区别

我之所以问这是因为我被@Greg D(从这个问题 )推荐使用SetCurrentValue()来代替,但看看文档,并没有看到有什么区别。 或者“不改变其价值来源”是什么意思?

SetValue()

设置依赖项属性标识符指定的依赖项属性的本地值。

SetCurrentValue()

设置依赖项属性的值,而不更改其值的来源。

你提供的MSDN链接说得很好:

这个方法被一个组件使用,该组件使用编程的方式来设置它自己的一个属性的值,而不禁用应用程序声明的属性的使用。 SetCurrentValue方法更改属性的有效值,但现有的触发器,数据绑定和样式将继续工作。

假设您正在编写TextBox控件,并且已经公开了人们经常使用的Text属性,如下所示:

 <TextBox Text="{Binding SomeProperty}"/> 

在你的控件的代码中,如果你调用SetValue你将会用你提供的任何东西来覆盖绑定。 但是,如果调用SetCurrentValue ,将确保该属性具有给定的值,但不会销毁任何绑定。

据我所知,格雷格的build议是不正确的。 您应该始终使用CLR包装器属性中的GetValue / SetValueSetCurrentValue在您需要属性接受给定值但不想覆盖已针对您的属性configuration的任何绑定,触发器或样式的情况下更有用。

除了被接受的答案:

我发现这篇文章很好地解释了SetCurrentValue()。 请注意,依赖属性值优先级系统将如何取超出绑定值的本地值。 这解释了评论者意想不到的行为。