3

バックグラウンド スレッドのコードで (オブジェクトを使用して) 変更する必要がある がありますObservableCollection。私もそのコレクションに添付されています。実行時にコレクションを変更すると、コードは正常に実行されます。単体テストで、「このタイプの CollectionView は、Dispatcher スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」というエラーが表示されます。ViewModelTaskICollectionView

このようにしてコレクションを作成します (実行時の 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