【问题标题】:Data binding to a static property in WPF数据绑定到 WPF 中的静态属性
【发布时间】:2023-12-20 14:26:01
【问题描述】:

我有一个名为 StockItem 的类。
该类包含一些实例属性,包括数量。
该类包含一些静态属性,包括 Cart 和 CartTotalPrice。
购物车类型是 ObservableCollection。
CartTotalPrice 返回购物车总价。

我创建了一个名为 UCOrder 的用户控件,允许用户将商品添加到购物车中。
我创建了另一个 UserControl 允许用户更改购物车项目的数量。

我已经在 UCOrder 的标记中声明了一个 TextBlock。
我想将 TextBlock 绑定到静态属性 StockItem.CartTotalPrice,以便 TextBlock 显示当前的 CartTotalPrice。
我该怎么做?

任何帮助将不胜感激

【问题讨论】:

  • 我不明白 CartTotalPrice 和 Cart 怎么可能是静态的。如果是,则意味着所有 StockItem 对象都与同一个唯一的购物车相关联。你能把这两个类的代码贴出来吗?
  • 创建一个非静态可观察属性,该属性在内部使用静态属性并绑定到该属性;话虽如此,正如 Marshall777 指出的那样,statis 属性通常是一个坏主意。
  • @stijn 你如何创建一个可观察的属性?

标签: wpf data-binding static


【解决方案1】:
<TextBlock Text="{Binding Source={x:Static StockItem.CartTotalPrice}}"/>

一开始可能看起来很奇怪,但Source 告诉我们绑​​定的实际来源,通常是DataContext,但我们将它设置为使用我们的静态属性。使用路径,我们现在将在源对象上提供一个属性,但是因为我们已经在源中拥有了我们想要的东西,所以我们不设置默认为“。”的路径。意思是“直接取源”。

但请注意您问题下的 cmets。虽然我刚刚回答了你的问题,但由于已经提到的原因,我也认为这样做是个坏主意。

【讨论】:

  • 我知道 Cart 和 CartTotalPrice 不应该是静态属性,但我正在创建一个测试应用程序。我已经按照您的描述更改了我的 TextBlock 的声明,但 TextBlock 不会自动刷新。例如,用户将商品添加到购物车后,TextBlock 不会刷新。
  • 当然不是,这就是为什么我们都说这不是一个好主意。要更新它,您要么需要实现 INotifyPropertyChanged 并引发每个属性更改。但这不适用于静态属性。另一种选择是通过UpdateTarget 手动拉取更改。