【问题标题】:ObservableCollection of objects containing Lists包含列表的对象的 ObservableCollection
【发布时间】:2011-06-21 07:08:35
【问题描述】:

我使用 ObservableCollection 进行数据绑定作为 DataGrid 的 ItemsSource。集合包含复杂类型对象。这种类型的属性之一是字符串列表。

现在我看到,当我从代码更新此 List 属性时,UI 中没有任何变化(主绑定工作正常)。所以,我的问题是:这是预期的行为吗?也许我不应该使用 List 作为类型的一部分,而应该使用 ObservableCollection?

更新

模式设置为单向。

【问题讨论】:

  • Jehof 是正确的,但是,您可能还需要使用 HierarchicalDataTemplate(取决于视图)。
  • 类型应该公开ICollection或其他接口作为属性,支持字段应该实现INotifyCollectionChanged,例如ObservableCollection。

标签: c# wpf data-binding observablecollection


【解决方案1】:

使用实现接口INotifyCollectionChanged(如ObservableCollection)的集合而不是List。然后对集合的更改会填充到 UI。

【讨论】:

    【解决方案2】:

    是的,这是预期的行为。可观察集合仅通知其自身内容的更改 - 即添加、删除、重新排序。

    您正在查看的是对 observablecollection 中元素的更改 - 如果您想查看对放入的类的更改,您的元素必须实现 INotifyPropertyChanged。

    所以目前:如果复杂对象上的列表属性发生更改,您将看不到它,但是如果您也将其更改为 observablecollection,您可以在子项控件(如组合框)中看到该集合的更改 - 但不是如果您将集合对象更改为另一个对象 - 因此如果您不实现 INotifyPropertyChanged,则应在应用绑定之前设置集合属性。

    【讨论】:

    • 这正是我一个小时前所做的——在整个结构上使用 ObservableCollection 而不是 List + INotifyPropertyObject(真丢脸,我早该想到的)。我将您的回答标记为我的问题的解决方案。
    【解决方案3】:

    当你更新你的列表时,你必须调用 INotifyPropertyChange 否则 UI 不会更新列表结果..

    INotifyPropertyChange 表示项目源中发生了一些更改,因此请更新它。

    【讨论】:

    • 无济于事,因为与旧值的比较是相同的。外部集合也没有改变 - 无需更新其视图(性能)内部集合是必须实现 INotifyCollectionChanged
    • @Dammy:INotifyCollectionChanged 毫无疑问会起作用。但我使用 INotifyCollectionChanged 处理属性来绑定它对我有用。我知道我告诉的方式..
    【解决方案4】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2017-01-24
    • 2023-03-22
    • 2016-10-01
    • 2022-01-06
    相关资源
    最近更新 更多