WPF ICollectionView刷新

时间:2009-08-05 11:17:15

标签: wpf multithreading collections refresh

有什么办法吗

ICollectionView.Refresh() 

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

单独的帖子中

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

我需要第二个线程的原因是,我有一个显示IMyItem列表的Control。过滤此Collection时(通过用户文本更改输入),我希望能够显示CollectionView正在更改的动画。

3 个答案:

答案 0 :(得分:3)

如何使用Dispatcher处理后台优先级?

Dispatcher.Invoke(DispatcherPriority.Background,
    () => { CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); }
);

答案 1 :(得分:3)

你不能!

所有UI操作必须在用户界面线程上发生,并且几乎WPF的DispatcherObject内部的每个调用(以及该层次结构中的所有控件)都会定期调用CheckAccess()。

如果您正在后台线程或BackgroundWorker中进行处理,您可能需要考虑使用ObservableCollection来帮助保持数据的最新状态。

答案 2 :(得分:-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);