1

有什么办法吗

ICollectionView.Refresh() 

或者

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

在一个单独的线程中?

我知道我可以使用调度程序,但是这个集合绑定到一个 ListView 并且它抛出了跨线程异常。

我需要第二个线程的原因是,我有显示 IMyItems 列表的 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 回答