我创建了一个 MAUI 应用程序,在视图模型中我有一个 ObservableCollection 存储位置。然后这些将显示在 UI 上的图表上。 但位置的计算需要花费大量时间,因此我在另一个线程上进行计算以保持 UI 畅通。当我计算位置时,我通过调用 Application.Current.Dispatcher.Dispatch 方法将其添加到新线程上的集合中,如下所示:
Task.Run(() =>
{
for (int i = 0; i < 1000; i++)
{
Application.Current.Dispatcher.Dispatch(() =>
{
myObservableCollection.Add(new Pos() { X = i, Y = i }));
}
}
}
它工作得很好,但我想避免每次迭代中不断的线程切换,所以我想出了这个:
Task.Run(() =>
{
List<Pos> test = new List<Pos>();
for (int i = 0; i < 1000; i++)
{
test.Add(new Pos() { X = i, Y = i }));
}
Application.Current.Dispatcher.Dispatch(() =>
{
myObservableCollection= new ObservableCollection<Pos>(test);
});
}
因此,我创建了列表,并且仅在准备好时才将其传递给可观察集合,以避免线程切换。但这个解决方案根本没有更新用户界面,并且在第一个解决方案完美运行的同时什么也没有出现。为什么第二个不起作用?
因为您的 UI 绑定到 myObservableCollection
的
实例- 每次您创建新实例时,与旧实例的绑定仍然存在并且不会更新。
有几种方法可以解决这个问题。最简单的方法是在虚拟机上实现
INotifyPropertyChanged
并在 PropertyChanged
的 setter 中调用
myObservableCollection
或者,您可以使用
ObservableRangeCollection
,它允许您一次将多个项目添加到集合中