为什么我的 ObservableCollection 在使用新列表重新初始化时没有更新?

问题描述 投票:0回答:1

我创建了一个 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);
    });
}

因此,我创建了列表,并且仅在准备好时才将其传递给可观察集合,以避免线程切换。但这个解决方案根本没有更新用户界面,并且在第一个解决方案完美运行的同时什么也没有出现。为什么第二个不起作用?

c# multithreading observablecollection maui
1个回答
4
投票

因为您的 UI 绑定到 myObservableCollection

实例
- 每次您创建新实例时,与旧实例的绑定仍然存在并且不会更新。

有几种方法可以解决这个问题。最简单的方法是在虚拟机上实现

INotifyPropertyChanged
并在
PropertyChanged
 的 setter 中调用 
myObservableCollection

或者,您可以使用

ObservableRangeCollection
,它允许您一次将多个项目添加到集合中

© www.soinside.com 2019 - 2024. All rights reserved.