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

Ren*_*821 0 c# multithreading observablecollection maui

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

Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我想避免每次迭代中不断的线程切换,所以我想出了这个:

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);
    });
}

Run Code Online (Sandbox Code Playgroud)

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

Jas*_*son 5

因为您的 UI 绑定到一个实例-myObservableCollection每次您创建新实例时,与旧实例的绑定仍然存在并且不会更新。

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

或者,您可以使用ObservableRangeCollection允许您一次将多个项目添加到集合中的