Dependency Property SetValue()和SetCurrentValue()之间的区别是什么

Jie*_*eng 49 wpf dependency-properties setvalue setcurrentvalue

我问这个的原因是因为我被@Greg D(来自这个问题)的推荐用来SetCurrentValue()代替,但看看文档并没有看到差异.或者什么"不改变其价值来源"意味着什么呢?

SetValue()

设置依赖项属性的本地值,由其依赖项属性标识符指定.

SetCurrentValue()

设置依赖项属性的值而不更改其值源.

Ken*_*art 55

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

此方法由组件使用,该组件以编程方式设置其自身属性之一的值,而不禁用应用程序声明的属性使用.SetCurrentValue方法更改属性的有效值,但现有的触发器,数据绑定和样式将继续工作.

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

<TextBox Text="{Binding SomeProperty}"/>
Run Code Online (Sandbox Code Playgroud)

在您的控件代码中,如果您打电话,SetValue您将使用您提供的任何内容覆盖绑定.SetCurrentValue但是,如果调用,将确保属性采用给定值,但不会销毁任何绑定.

据我所知,格雷格的建议是不正确的.您应该始终使用GetValue/ SetValue来自您的CLR包装器属性.SetCurrentValue在需要属性获取给定值但不想覆盖已针对您的属性配置的任何绑定,触发器或样式的场景中更有用.

  • 当我在[**Screenr Video**](http://screenr.com/3Pc)中使用`SetValue`时,我试着查看是否有任何绑定被破坏.一切正常吗?也许我没有做破坏绑定的事情?但是我该怎么做呢? (5认同)
  • 在.Net 4之前缺少`SetCurrentValue()`是使得实现一个适当的,自包含的,功能齐全的`NumericUpDownControl`难以理解的一件事.点击这样的控制的经典向上/向下箭头通常将修改控制值编​​程,但()``具有的SetValue,即吹走,该用户可能已经针对该字段所实现的任何绑定.`SetCurrentValue()`允许您从上下按钮以编程方式修改属性的值,而不会破坏对后备数据的绑定. (4认同)
  • 我认为绑定主要仅在绑定模式不是TwoWay的情况下被破坏.对于TwoWay绑定,从我的观察中使用SetValue一切似乎都有效. (4认同)
  • 在Vincent Sibal的博客中(http://blogs.msdn.com/b/vinsibal/archive/2009/05/21/the-control-local-values-bug-solution-and-new-wpf-4-0-related -apis.aspx)你可以在最后阅读以下内容."对于控件开发人员,一般建议在控制代码中始终使用DependencyObject.SetCurrentValue而不是DependencyObject.SetValue.您会注意到我们在4.0框架中的库存控件都已更新为使用此API而不是设置属性当地价值观." 你们两个都可能是正确的,但是你能解释一下这里的差异以及博客的推荐吗? (2认同)
  • @Meleak:说实话,我觉得这个帖子有点不清楚.我想他的意思是说`SetCurrentValue`应该在你想要*内部*修改依赖属性值的控件中的任何地方使用.实际上,如果你破解他的示例项目,你会发现他仍然在CLR属性包装器中使用`GetValue`和`SetValue`.实际上,如果你破解.NET 4.0开放式反射器,你会发现它仍然是这样. (2认同)
  • 嗯,到目前为止,我一直使用`SetValue`作为它由Visual Studio生成,它工作正常.通过破坏绑定我真的不明白你的意思.第一次改变后,我的Binding不会被破坏?我仍然可以进行更改,Binding仍然有效吗? (2认同)