3

我有一个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();
    }
}

所以在运行时调度器被正确拾取,可观察集合被更新,过滤后的视图也被更新。在运行单元测试时,我在尝试向集合中添加新项目时遇到异常。

任何人都可以提出解决这个问题的方法,以便我可以进行测试吗?

4

0 回答 0