【问题标题】:Improving performance of INotifyPropertyChanged affecting all items in a collection提高影响集合中所有项目的 INotifyPropertyChanged 的​​性能
【发布时间】:2021-03-21 19:28:46
【问题描述】:

我有一个ObservableCollection,用作Xamarin Forms DataGridItemsSource。集合中的每个视图模型都有一个可观察的IsSelected 属性,绑定到数据网格行模板中的Switch。此数据网格中最多可以有约 20k 行。

有用于“全选”和“全选”的按钮,它们可以满足您的期望:它们将此属性设置为集合中每个元素 的适当值。对于大型集合,这需要几秒钟才能完成,原因是处理所有这些属性更改通知以保持 UI 同步。

有没有办法批量处理这些更改通知,或者暂停它们并以老式方式更新 UI,或者做其他事情来提高性能?我为batching PropertyChanged notifications 看到的技术涉及将多个更改合并到同一对象上的同一属性,这不是我遇到的问题。

【问题讨论】:

  • “最多约 20k 行” - 我强烈建议重新考虑这一点。移动设备上的用户真的需要 20k 行数据吗?您至少可以虚拟化显示,以便只更新可见行吗?
  • @Jason 我确实相信这个问题域中的用户在现场时需要访问他们的数据,是的。 “虚拟化显示”我认为需要修改第三方DataGrid插件,原则上是可能的,我想知道它是否有一个共同的模式。
  • 如果这确实是一个需求,我会考虑支持虚拟化的商业组件,而不是您正在使用的免费组件
  • @Jason 我已经问过是否有预算,但被告知没有。

标签: performance xamarin.forms inotifypropertychanged


【解决方案1】:

选项 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。

【讨论】:

  • @Graham Lee 如果回复有帮助,请采纳为答案(点击此答案左上角的“✔”),对有类似问题的其他人会有所帮助
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2017-07-23
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多