我創建了一個 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);
});
}
因此,我創建了串列,并且僅在準備好避免執行緒切換時將其傳遞給 observable 集合。但是這個解決方案根本沒有更新用戶界面,同時第一個作業完美無缺。為什么第二個不起作用?
uj5u.com熱心網友回復:
因為您的 UI 系結到一個實體-myObservableCollection每次創建新實體時,與舊實體的系結仍然存在并且不會更新。
有幾種方法可以解決這個問題。最簡單的方法是在您的 VM 上實作并INotifyPropertyChanged呼叫PropertyChangedmyObservableCollection
或者,您可以使用ObservableRangeCollection允許您一次將多個專案添加到集合中
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/532698.html
