【问题标题】:Firing PropertyChanged event in a complex, nested type in WPF在 WPF 中以复杂的嵌套类型触发 PropertyChanged 事件
【发布时间】:2011-02-11 11:35:11
【问题描述】:

我有一个名为DataStore 的班级和一个Departments 的列表(ObservableCollection),每个部门又有一个Products 的列表。 Product 类中更改的属性也会影响DepartmentDataStore 类中的属性。每个Product 如何通知它所属的DepartmentDataStore(它是所有的母类)它的一个或多个属性已经改变了它们的值? 例子: 产品具有 NumberSoldToday 属性并已绑定。该部门有一个名为 TotalNumberOfProductsSold 的属性:

public int TotalNumberOfProductsSold
{
  get
  {
    int result = 0;
    foreach(Product p in this.products)
      result += p.NumberSoldToday;
    return result;
  }
}

并且数据存储有一个属性 TotalProductsSold(适用于所有部门):

public int TotalProductsSold
{
  get
  {
    int result = 0;
    foreach(Product p in this.deparments)
      result += p.TotalNumberOfProductsSold;
    return result;
  }
}

如果所有这些属性都被绑定,并且最里面的属性发生变化,它必须以某种方式通知其他 2 的值也发生了变化。 怎么样?

我能看到这种情况发生的唯一方法是在每个类中连接 PropertyChanged 事件。删除时也必须触发该事件,分别添加到产品和部门的集合中。

有没有更好、更聪明的方法来做到这一点?

【问题讨论】:

    标签: .net wpf data-binding inotifypropertychanged


    【解决方案1】:

    与其在需要时计算该值,不如在应该影响它的事物发生变化时设置该值。在这种情况下,您需要处理 this.deparments.CollectionChanged 事件,并在那里进行计算。 TotalProductsSold 属性看起来就像任何其他属性,在其设置器中调用 FireNotifyPropertyChanged("TotalProductsSold")...

    【讨论】:

    • 我明白了。回到我上面的例子,假设我订阅了 Department 中的 CollectionChanged 事件。当集合项 (=Product) 中的一个属性发生更改时,该事件是否会被触发?该事件不只是用于添加/删除/移动吗?
    • @John - 当集合内的对象的某个属性发生更改时,CollectionChanged 不会触发。为此,您必须订阅他们各自的 PropertyChanged 事件。当从集合中添加或删除项目时,您可以关联这些事件。
    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2021-11-27
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多