将整个ObservableCollection替换为另一个ObservableCollection

Ada*_*abo 8 c# wpf binding observablecollection

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何ItemsGetNewItems()不带的返回值替换整个内容:

  1. 打破绑定.

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

Ty *_*row 7

你有一些选择:

  1. 实现INotifyPropertyChanged,以便您可以通知UI项的值已更改.这不利用在ObservableCollection上实现INotifyCollectionChanged的事实.它会起作用,但它首先违背了使用ObservableCollection的目的.这不推荐,但它有效.
  2. 使用ObservableCollection的Add/Remove/Modify/Update方法与Dispatcher一起修改它.
    • 注意:如果没有Dispatcher,您将获得NotSupportedException,因为CollectionViews不支持从与Dispatcher线程不同的线程更改其SourceCollection.
  3. 使用ObservableCollection的Add/Remove/Modify/Update方法将其与BindingOperations.EnableCollectionSynchronization.一起修改.推荐的
    • 注意:这仅适用于.NET 4.5.
    • 这是在避免使用NotSupportedException时使用Dispatcher的替代方法.

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

参考:Reed Copsey答案 - StackOverflow