2010-11-20 169 views

回答

46

您提供的MSDN链接说,这非常好:

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

假设你正在写的TextBox控制,你已经露出了Text属性,人们经常使用如下:

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

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

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

+2

在文森特西巴尔的博客(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,而不是用当地价值“。你们两个都可能是对的,但你能解释一下这里的不同以及博客的建议吗? – 2010-11-20 11:19:59

+1

@Meleak:说实话,我认为这篇文章有点不清楚。我想他的意思是说''SetCurrentValue'应该在你想要*内部修改一个依赖项属性值的控件中的任何地方使用。事实上,如果你打开他的示例项目,你会发现他仍然在CLR属性包装中使用'GetValue'和'SetValue'。事实上,如果你打开.NET 4.0的反射器,你会发现它仍然是这样。 – 2010-11-20 13:59:53

+2

嗯,到目前为止,我一直在使用Visual Studio生成的'SetValue',它工作正常。我并没有真正明白你的意思是破坏绑定。在第一次改变值后,我的绑定不会被破坏?因为我仍然可以进行更改,绑定仍然有效? – 2010-11-20 14:03:49

2

继接受的答案:

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