1

方法はありますか

ICollectionView.Refresh() 

また

CollectionViewSource.GetDefaultView(args.NewValue).Refresh();

別のスレッドで?

ディスパッチャーを使用できることはわかっていますが、このコレクションはListViewにバインドされており、クロススレッド例外がスローされます。

2番目のスレッドが必要な理由は、IMyItemのリストを表示するControlがあるためです。このコレクションを(ユーザーテキストの変更入力によって)フィルタリングするときに、CollectionViewが変更されているアニメーションを表示できるようにしたいと思います。

4

3 に答える 3

3

Dispatcherを使用してバックグラウンド優先で作業するのはどうですか?

Dispatcher.Invoke(DispatcherPriority.Background,
    () => { CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); }
);
于 2009-08-05T12:05:56.487 に答える
3

できません!

すべてのUI操作はユーザーインターフェイススレッドで実行する必要があり、WPFのDispatcherObject(およびその階層内のすべてのコントロール)内のほぼすべての呼び出しが定期的にCheckAccess()を呼び出します。

バックグラウンドスレッドまたはBackgroundWorkerで処理を行っている場合は、データを最新の状態に保つためにObservableCollectionの使用を検討することをお勧めします。

于 2009-08-06T04:01:09.723 に答える
-2

wpfディスパッチ可能オブジェクトでアクションを呼び出すためのクイックメソッドをハックしました(すべてのwpfコントロールはDispatcherObjectから継承します)

public static void InvokeWpf(DispatcherObject dispatchable, Action action, bool async)
{
    // DispatcherOperationCallback is optimized for wpf invoke calls
    DispatcherOperationCallback toDo = delegate{ action(); return null; };

    if (!dispatchable.CheckAccess())
    {
        if (async) 
            dispatchable.Dispatcher.BeginInvoke(toDo, null);
        else
            dispatchable.Dispatcher.Invoke(toDo, null);
    }
    else
    {
        toDo(null);
    }
}

使用法:

InvokeWpf(listView, 
       () => CollectionViewSource.GetDefaultView(listView).Refresh(), 
       false);
于 2009-08-05T11:26:11.217 に答える