У меня есть пример, который повторяет то, что я пытаюсь выполнить. Как будет выглядеть следующий код: у меня есть 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);
}
}
}
}
К сожалению, этот элемент блокирует этот пользовательский интерфейс. Он будет обновлять только представление, когда цикл завершается. То, как я это решил, нарушает концепции 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 знает о элементе listBox из пользовательского интерфейса. И, глядя на диаграмму MVVM, только View должен иметь ссылку на ViewModel через привязку. Как решить эту проблему? Спасибо.
Как решить какую проблему? –