我有一个ObservableCollection
需要ViewModel
在后台线程上的代码中修改的内容(使用Task
对象)。我也有一个ICollectionView
附加到那个集合。当我在运行时修改集合时,代码运行良好。在单元测试中,我收到错误消息,“这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。”
因此,我创建了集合(在运行时的 UI 线程上):
CashDeliveryDepots = new ObservableCollection<CashDeliveryDepot>();
FilteredCashDeliveryDepots = CollectionViewSource.GetDefaultView(CashDeliveryDepots);
并使用此代码修改它(它将在运行时在非 UI 线程上运行):
CurrentDispatcher.Invoke(() =>
{
foreach (var depot in depots)
{
CashDeliveryDepots.Add(depot);
}
});
该类CurrentDispatcher
根据是否存在应用程序调度程序来执行代码。
internal static class CurrentDispatcher
{
internal static void Invoke(Action action)
{
if (Application.Current != null)
Application.Current.Dispatcher.Invoke(action);
else
action();
}
}
所以在运行时调度器被正确拾取,可观察集合被更新,过滤后的视图也被更新。在运行单元测试时,我在尝试向集合中添加新项目时遇到异常。
任何人都可以提出解决这个问题的方法,以便我可以进行测试吗?