提高影响集合中所有项目的 INotifyPropertyChanged 的性能
Improving performance of INotifyPropertyChanged affecting all items in a collection
我有一个 ObservableCollection
用作 Xamarin Forms DataGrid 的 ItemsSource
。集合中的每个视图模型都有一个可观察的 IsSelected
属性,绑定到数据网格的行模板中的 Switch
。此数据网格中最多可以有 ~20k 行。
有按钮“Select All”和“Select None”,它们的作用与您期望的一样:它们将此 属性 设置为适当的集合中每个元素 的值。对于大型集合,这需要几秒钟才能完成,原因是处理所有这些 属性 更改通知以保持 UI 同步。
有没有办法批量处理这些更改通知,或者暂停它们并更新 UI 老式的方式,或者做一些其他的事情来提高性能?我在 batching PropertyChanged
notifications 中看到的技术涉及将多个更改合并到同一对象上的同一 属性,这不是我遇到的问题。
选项 1:
如果我们需要加载大量项目,我们总是使用分页。在您的情况下,您可以在我们将它们添加到 ItemsSource 之前更新接下来的十个或更多项目 IsSelected
。
选项 2:
您一次可以 运行 多个方法。这样您就可以在多种方法中更新 IsSelected
的值(在每个方法中您可以更新 1000 个或更多项)
// this process run synchronously.
Task.Run(() =>
{
// call your methods
MyFunction1(); // update 1-1000
MyFunction2(); // update 1001-2000
});
// this process doesn't wait for function execution,it will run Asynchronous way.use this if you dont want to use function return value;
Task.Factory.StartNew(MyFunction1);
Task.Factory.StartNew(MyFunction2);
这两个过程都可以帮助您实现非阻塞 UI。
我有一个 ObservableCollection
用作 Xamarin Forms DataGrid 的 ItemsSource
。集合中的每个视图模型都有一个可观察的 IsSelected
属性,绑定到数据网格的行模板中的 Switch
。此数据网格中最多可以有 ~20k 行。
有按钮“Select All”和“Select None”,它们的作用与您期望的一样:它们将此 属性 设置为适当的集合中每个元素 的值。对于大型集合,这需要几秒钟才能完成,原因是处理所有这些 属性 更改通知以保持 UI 同步。
有没有办法批量处理这些更改通知,或者暂停它们并更新 UI 老式的方式,或者做一些其他的事情来提高性能?我在 batching PropertyChanged
notifications 中看到的技术涉及将多个更改合并到同一对象上的同一 属性,这不是我遇到的问题。
选项 1:
如果我们需要加载大量项目,我们总是使用分页。在您的情况下,您可以在我们将它们添加到 ItemsSource 之前更新接下来的十个或更多项目 IsSelected
。
选项 2:
您一次可以 运行 多个方法。这样您就可以在多种方法中更新 IsSelected
的值(在每个方法中您可以更新 1000 个或更多项)
// this process run synchronously.
Task.Run(() =>
{
// call your methods
MyFunction1(); // update 1-1000
MyFunction2(); // update 1001-2000
});
// this process doesn't wait for function execution,it will run Asynchronous way.use this if you dont want to use function return value;
Task.Factory.StartNew(MyFunction1);
Task.Factory.StartNew(MyFunction2);
这两个过程都可以帮助您实现非阻塞 UI。