有什么办法吗
ICollectionView.Refresh()
或
CollectionViewSource.GetDefaultView(args.NewValue).Refresh();
在单独的帖子中?
我知道我可以使用调度程序,但是这个集合绑定到ListView并且它会抛出交叉线程异常。
我需要第二个线程的原因是,我有一个显示IMyItem列表的Control。过滤此Collection时(通过用户文本更改输入),我希望能够显示CollectionView正在更改的动画。
答案 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);