我在這裏有一個例子,它複製了我試圖完成的任務。 由於下面的代碼將顯示 - 我有ViewModel更新綁定到視圖的ObservableCollection屬性。通常我會從模型中檢索的結果更新集合,但希望這個例子足夠了。在具有長時間運行的進程的視圖上使用MVVM
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Controls;
namespace MVVMWpf.ViewModel
{
public class ListViewModel
{
public ObservableCollection<int> SomeObjectCollection { get; set; }
public ListViewModel()
{
SomeObjectCollection = new ObservableCollection<int>();
}
public void Do()
{
for (int i = 1; i < 1000000; i++)
{
int i1 = i;
SomeObjectCollection.Add(i1);
}
}
}
}
不幸的是,這會阻止這個用戶界面。它只會更新View when循環運行完成。我解決它的方式打破了MVVM的概念。這就是爲什麼我需要你的幫助。我這樣做了。
public class ListViewModel
{
private delegate void LongRunningProcess();
public ObservableCollection<int> SomeObjectCollection { get; set; }
private ListBox listBox;
public ListViewModel(ListBox listBox)
{
this.listBox = listBox;
SomeObjectCollection = new ObservableCollection<int>();
}
public void Do()
{
Thread thread = new Thread(() =>
{
for (int i = 1; i < int.MaxValue; i++)
{
int i1 = i;
listBox.Dispatcher.Invoke(
new LongRunningProcess(() =>
SomeObjectCollection.Add(i1);
}});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
}
正如你所看到的,ViewModel現在知道UI中的listBox元素。看着MVVM圖,只有View應該通過綁定來引用ViewModel。如何克服這個問題? 謝謝。
如何克服什麼問題? –