【问题标题】:How do I pass a property changed event to an ancestor?如何将属性更改事件传递给祖先?
【发布时间】:2010-10-13 21:56:08
【问题描述】:

我确定我在这里遗漏了一些基础知识,所以请多多包涵。

我有两个对象,一个 SalesOrder 和一个 SalesOrderLineItem。订单项保存在 SalesOrder 的 Observablecollection<SalesOrderLineItem> 中,如果我添加订单项,我的数据绑定 listView 就会知道新项目。

现在我遇到了一个问题:SalesOrder 有一个名为“OrderTotal”的只读属性,它知道所有订单项组合的总价格是多少。

如果我更改订单项的数量或价格,我似乎不知道如何让更改通知冒泡到“OrderTotal”。

这两个类都继承自 INotifyPropertyChanged 并触发。

我错过了什么?

【问题讨论】:

    标签: c# wpf data-binding .net-3.5


    【解决方案1】:

    ObservableCollection 仅在添加、删除项目或刷新列表时通知,而不是在集合中的项目的属性发生更改时通知。

    SalesOrder 类需要监听每个 SalesOrderLineItem 的 PropertyChanged 事件。

    -

    OrderTotal 属性也可以是动态的,每次都会生成总数...

    【讨论】:

    • 这就是我的想法,但 WPF 似乎有如此强大的功能,我想知道是否有不同的解决方案。如果没有,我会这样做,但我觉得应该有一种更优雅的方式来处理这个问题。
    • 很遗憾,我同意 Aaron 的观点,您必须倾听每个 SalesOrderLineItem 和集合。 WPF 确实有 RoutedEvents 冒泡,但这些仅适用于可视化树;你不能在一些任意的对象图中使用它们。
    • 我同意。 WPF 中的绑定非常强大,可能有更好的方法来做到这一点。您可能想以不同的方式提出您的问题。现在它让我相信你正在寻找一种方法 ObservableCollection 将解决这个问题。更笼统地再问一遍 - 并使用差异主题
    • 是的,我确定我问错了一些问题。我想现在我会用这种方法,只是下定决心不知道我现在不知道什么。从现在起 3 个月后,我相信我会更好地了解如何提问。
    【解决方案2】:

    如果您喜欢冒险,可以尝试BindableLinq 或类似的东西。 它允许您公开侦听更改的查询结果。

    但它还没有结束测试,我不确定它是否会... ContinuousLinq 是另一个,但它根本不支持 Silverlight。

    除此之外,您还必须倾听每个孩子的声音,并在集合发生变化时添加/删除处理程序。

    【讨论】:

      【解决方案3】:
      public ObservableCollection<TestClass> List
          {
              get { return _List; }
              set {
                  if (_List!= value)
                  {
                      _List = value;
                      raisePropertyChange("List");
                      List.ToList().ForEach(i=> i.PropertyChanged+= (o,e)=>
                      {
                          //PropertyChanged.Raise(() => List);
              raisePropertyChange("List");
              //or what ever you want
                      }
                  );
      
      
                  }
              }
          }
      

      【讨论】:

      • 请不要对多个问题发布完全相同的答案:它要么不适合所有人,要么问题是重复的,应该这样标记/关闭。
      • 好的,我不会再这样做了
      猜你喜欢
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2011-03-08
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2023-01-16
      相关资源
      最近更新 更多