我正在使用此处描述的 SortableObservableCollection 。现在我想从 UI 或非 UI 线程操作它,所以我尝试了这里描述的解决方案:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime;
using System.Windows.Data;
public class SortableObservableCollection<T> : ObservableCollection<T>
{
private object _itemsLock = new object();
public SortableObservableCollection()
: base()
{
BindingOperations.EnableCollectionSynchronization(this, _itemsLock);
}
public SortableObservableCollection(List<T> l) : base(l)
{
BindingOperations.EnableCollectionSynchronization(this, _itemsLock);
}
public SortableObservableCollection(IEnumerable<T> l) : base(l)
{
BindingOperations.EnableCollectionSynchronization(this, _itemsLock);
}
#region Sorting
public void Sort<TKey>(Func<T, TKey> keySelector)
{
InternalSort(Items.OrderBy(keySelector));
}
public void SortDescending<TKey>(Func<T, TKey> keySelector)
{
InternalSort(Items.OrderByDescending(keySelector));
}
public void Sort<TKey>(Func<T, TKey> keySelector, IComparer<TKey> comparer)
{
InternalSort(Items.OrderBy(keySelector, comparer));
}
private void InternalSort(IEnumerable<T> sortedItems)
{
var sortedItemsList = sortedItems.ToList();
foreach (var item in sortedItemsList)
{
Move(IndexOf(item), sortedItemsList.IndexOf(item));
}
}
#endregion // Sorting
public new void Add(T item)
{
base.Add(item);
}
但是 .Net 4.5.2、WPF 桌面应用程序中的这个解决方案在移除、添加和清除方法中引发异常:System.NotSupportedException : '这种类型的 CollectionView 不支持从不同于调度程序的线程更改其 SourceCollection线。'
所以,自从BindingOperations.EnableCollectionSynchronization(this, _itemsLock); 之后,我又回到使用 Application.Current.Dispatcher 方法(见下文)。机制不像上面链接的博客文章中宣传的那样工作。
我的问题是:我在第一个列表中做错了什么,还是博客文章不正确,声称线程边界总是可以通过这种机制成功跨越?下面的清单是最好的,还是有更好的解决方案来管理具有跨线程绑定的 observablecollection?
泛舟湖上清波郎朗
相关分类