gpt4 book ai didi

c# - 用另一个 ObservableCollection 替换整个 ObservableCollection

转载 作者:太空狗 更新时间:2023-10-29 18:25:10 29 4
gpt4 key购买 nike

public class Alpha
{
public ObservableCollection<Beta> Items { get; set; }

public Alpha()
{
Items = new ObservableCollection<Beta>();
}

public void DoSomething()
{
Items = GetNewItems(); // whenever I do this, Items gets a new referene,
// so every WPF binding (e.g. datagrids) are broken
}

public ObservableCollection<Beta> GetNewItems()
{
var ret = new ObservableCollection<Beta>();
// some logic for getting some items from somewhere, and populating ret
return ret;
}
}

如何使用 GetNewItems() 的返回值替换 Items 的全部内容,而无需:

  1. 打破绑定(bind)。

  2. 必须循环遍历项目并将它们一个接一个地复制到另一个集合?

最佳答案

您有一些选择:

  1. 实现 INotifyPropertyChanged,以便通知 UI Items 的值已更改。这没有利用 INotifyCollectionChanged 是在 ObservableCollection 上实现的事实。它会起作用,但它首先违背了使用 ObservableCollection 的目的。不推荐这样做,但它有效。
  2. 使用 ObservableCollection 的 Add/Remove/Modify/Update 方法与 Dispatcher 一起修改它。
    • 注意:如果没有 Dispatcher,您将收到 NotSupportedException,因为CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection
  3. 使用 ObservableCollection 的添加/删除/修改/更新方法结合 BindingOperations.EnableCollectionSynchronization 对其进行修改。 推荐
    • 注意:这仅在 .NET 4.5 中可用。
    • 这是在避免 NotSupportedException 的同时使用 Dispatcher 的替代方法。
    • Example

关于您的问题,第 2 条和第 3 条转化为清除现有项目 (Clear()),然后添加 (Add()) 通过您想要的任何方法返回的项目 - 请参见 #3 的示例。它们的关键是必须使用 Dispatcher (2) 或调用 BindingOperations.EnableCollectionSynchronization 来完成清除和所有添加。祝你好运!

引用:Reed Copsey Answer - StackOverflow

关于c# - 用另一个 ObservableCollection 替换整个 ObservableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17996542/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com