我在这里有一个例子,它复制了我想要完成的事情。正如以下代码所示 - 我有 ViewModel 更新绑定到视图的 ObservableCollection 属性。通常我会根据从模型中检索到的结果来更新集合,但希望这个示例就足够了。
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);
}
}
}
}
不幸的是,这会阻止这个 UI。它只会在循环运行完成时更新视图。我解决它的方式打破了 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。如何克服这个问题?谢谢。