异步 CollectionViewSource 过滤?
async CollectionViewSource filtering?
我的文件太大了ObservableCollection<MyItem>
,我需要提供用户友好的过滤功能。
public static async Task RefilterViewAsync(this ItemsControl @this, Predicate<object> compareLogic)
{
await Task.Run(
() =>
{
var collectionView = CollectionViewSource.GetDefaultView(@this.ItemsSource);
if (collectionView.CanFilter)
{
collectionView.Filter = compareLogic;
}
else throw new InvalidOperationException("Filtering not supported...");
collectionView.Refresh();
});
}
..问题是上面的代码由于某些原因不起作用。在 UI-thread 上过滤大约需要 1 分钟。任何想法如何实现异步过滤,至少能够显示一些 "processing.." 动画来帮助用户克服这个问题?
如果你有大量的 ObservableCollection
并且你想异步过滤掉它然后自己做。 AFAIK 不支持异步绑定。
我的意思是创建另一个 属性 类型的 ObservableCollection;这将是您的过滤集合。不是绑定实际集合,而是将过滤后的集合绑定到 ItemsControl
.
然后异步实现自己的过滤逻辑(可能在另一个线程中),最后设置过滤后的集合属性。绑定引擎将启动并相应地更新 UI。
我之前在我的一个项目中成功地使用过它。
我的文件太大了ObservableCollection<MyItem>
,我需要提供用户友好的过滤功能。
public static async Task RefilterViewAsync(this ItemsControl @this, Predicate<object> compareLogic)
{
await Task.Run(
() =>
{
var collectionView = CollectionViewSource.GetDefaultView(@this.ItemsSource);
if (collectionView.CanFilter)
{
collectionView.Filter = compareLogic;
}
else throw new InvalidOperationException("Filtering not supported...");
collectionView.Refresh();
});
}
..问题是上面的代码由于某些原因不起作用。在 UI-thread 上过滤大约需要 1 分钟。任何想法如何实现异步过滤,至少能够显示一些 "processing.." 动画来帮助用户克服这个问题?
如果你有大量的 ObservableCollection
并且你想异步过滤掉它然后自己做。 AFAIK 不支持异步绑定。
我的意思是创建另一个 属性 类型的 ObservableCollection;这将是您的过滤集合。不是绑定实际集合,而是将过滤后的集合绑定到 ItemsControl
.
然后异步实现自己的过滤逻辑(可能在另一个线程中),最后设置过滤后的集合属性。绑定引擎将启动并相应地更新 UI。 我之前在我的一个项目中成功地使用过它。