我一直在努力理解这个概念,即使经过许多实验,我仍然无法弄清楚WPF中的ObservableCollections和使用BindingOperations.EnableCollectionSynchronization的最佳实践是什么。

如果我有一个带有可观察集合的viewmodel,并使用锁启用了它的集契约(Contract)步,如下所示:

m_obsverableCollection = new ObservableCollection<..>;
BindingOperations.EnableCollectionSynchronization(m_obsverableCollection,
                                                   m_obsverableCollectionLock);

这是否意味着对该可观察集合的所有修改和枚举将:
  • 使用m_obsverableCollectionLock自动锁定集合吗?
  • 在创建集合的线程上进行所有修改吗?
  • 在对绑定(bind)操作进行调用的线程上进行所有修改吗?

  • 使用BindingOperations.EnableCollectionSynchronization时,我是否需要显式地进行任何锁定?

    产生所有这一切的问题是,即使在使用BindingOperations.EnableCollectionSynchronization和使用与我传递给该方法的锁相同的项锁定项目之后,我偶尔也会收到“这种CollectionView不支持从不同于该线程的线程对其SourceCollection进行更改。调度程序线程。”异常(exception)

    最佳答案

    我们终于找到了底线:

    我们必须在调度程序上启用CollectionSynchronization:

    Application.Current.Dispatcher.BeginInvoke(new Action(()=>
    {
        BindingOperations.EnableCollectionSynchronization(m_obsverableCollection, m_observableCollectionLock);
    }));
    

    然后,每当其他任何线程想要访问可观察对象时,您都可以简单地进行以下操作:
    lock (m_observableCollectionLock)
        m_observableCollection.Add(...)
    

    关于c# - WPF中的BindingOperations.EnableCollectionSynchronization之谜,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19734782/

    10-08 22:46