1
 <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 事件通知视图(UI)的更改

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

4

2 回答 2

4

StaticResourceDynamicResource参考 WPF 的资源,而不是绑定。

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

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

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

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

换个角度来看,你正在创建一个绑定,上面写着类似

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

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

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

于 2013-11-04T19:38:55.930 回答
0

StaticResource 或 DynamicResource 与 Binding 无关。

我会尽量简单地为您解释这一点。

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

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

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

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

现在回到绑定。在您的情况下,您告诉绑定源在哪里,并且从那时起绑定将起作用,而无需给出源是如何定义的。

于 2013-11-04T19:19:51.780 回答