WPF:带有Binding的静态资源是否为“TwoWay”支持双向绑定?

时间:2013-11-04 17:31:53

标签: wpf xaml data-binding

 <TextBox Name="CustomerName" Height="30" Margin="5"
  Text="{Binding Source={StaticResource MyCustomerData},
   Path=CustomerName, Mode=TwoWay}" Grid.Row="0" Grid.Column="1" />

以上是我的xaml片段

MuCustomerData是我的类,它实现了INotifyPropertyChanged接口,它有一个属性CustomerName,它将使用PropertyChanged事件通知View(UI)

这里我将我的类(MyCustomerData)绑定为StaticResource,并将绑定模式绑定为TwoWay。这实际上会以两种方式工作吗?或者我应该使用我的类作为动态资源来使绑定工作双向? 因为只有一次StaticResource被加载,并且当它是staticresource时不会进行任何进一步的更改.... 你的意见??我刚读过这个http://www.codeproject.com/Articles/393086/WPF-StaticResource-vs-DynamicResource ..请看看这篇文章..

2 个答案:

答案 0 :(得分:3)

StaticResourceDynamicResource是指WPF的资源,而不是Bindings。

StaticResource评估一次(通常在解析XAML时),并且永远不会再次评估,因为WPF假定资源是静态的并且不会改变。

DynamicResource表示资源是动态的,因此只要需要值就对其进行评估。

在您的情况下,绑定的Source属性将被评估一次,并且永远不再评估,因为它被设置为StaticResource。如果将MyCustomerData对象更改为新对象,则绑定将不会再次评估自身以反映更改。

但实际属性CustomerName将根据需要进行更新,因为它使用TwoWay绑定进行绑定。

以另一种方式来看,你正在创建一个类似

的绑定
var b = new Binding();
b.Source = MyCustomerData;
b.Path = "Name";
b.Mode = TwoWay;

使用b.Source设置StaticResource时,请考虑使用b.Source.Name进行绑定评估。但是,如果您要使用DynamicResource,请将其视为使用MyCustomerData.Name进行评估,因此它将使用当前版本的MyCustomerData

所以你可以设置MyCustomerData = new MyCustomerData();`在评估绑定一次后,动态资源会正确评估,而静态资源则不会。

答案 1 :(得分:0)

StaticResource或DynamicResource与Binding无关。

我会尽量为你解释这个。

StaticResource意味着您知道具有特定键的对象在哪个资源字典中被保留。而已。没有其他的。你知道它在StackPanel.Resources或Window.Resources。

当您在VisualTree中的某个对象中添加/加载带有键的对象到资源字典时,将使用DynamicResource。它的位置在app启动时是未知的,因此需要动态加载。

请记住,无论何时看到动态被提及,您使用何种语言进行编程都意味着某些事情在运行时发生,而不是从一开始就发生。

最好的例子是C#中动态生成的对象。这些对象允许您在运行时定义属性。当应用程序启动时,该对象非常空。

现在回到Binding。在你的情况下,你告诉Binding Source的位置,从Binding的那一点开始就可以工作,而不会给出如何定义Source。