【问题标题】:WPF: Does static Resource with Binding as "TwoWay' supports two way binding?WPF:绑定为“TwoWay”的静态资源是否支持双向绑定?
【发布时间】:2013-11-15 09:58:53
【问题描述】:
 <TextBox Name="CustomerName" Height="30" Margin="5"
  Text="{Binding Source={StaticResource MyCustomerData},
   Path=CustomerName, Mode=TwoWay}" Grid.Row="0" Grid.Column="1" />

上面是我的 xaml sn-p

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

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

【问题讨论】:

  • 当然,当你将绑定模式设置为双向时,它作为双向工作,是什么让你认为它可能不起作用?
  • @srsyogesh 好吧,我认为当资源是动态资源并且模式是两种方式时,绑定会以两种方式工作,而如果资源是静态资源并且绑定是两种方式,它不会......我不确定虽然..那是你发布的问题!
  • 尽量让你的问题标题更短一些,并将实际问题放在内容部分。另外,我没有看到您应该发布的 XAML 代码。请修改。
  • @Okuma.Scott 修改感谢您的建议 :)

标签: wpf xaml data-binding


【解决方案1】:

StaticResource 和 DynamicResource 指的是 WPF 的资源,而不是绑定。

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

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

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

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

换个角度来看,你正在创建一个类似

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

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

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

【讨论】:

    【解决方案2】:

    StaticResource 或 DynamicResource 与 Binding 无关。

    我会尽量为你解释清楚。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-15
      • 2011-09-12
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多