ObservableCollection в Model + Threading в ViewModel - PullRequest
1 голос
/ 18 февраля 2010

Наша внешняя команда разработчиков создала модель со свойством ObservableCollection. Теперь я отвечаю за создание ViewModel, и у меня возникли проблемы, потому что упомянутая Модель работает внутри BackgroundWorker (другой поток) - что означает, что я не могу обновить View, перехватывая события CollectionChanged. Вот обходной путь, который я сделал:

private Model model = new Model();
public ObservableCollection<Entry> Entries { get; set; }

public ctor()
{
    BackgroundWorker peon = new BackgroundWorker();
    peon.DoWork += work;
    peon.RunWorkerCompleted += updateViewCollection;
    peon.RunWorkerAsync();
}

private void work(object sender, DoWorkEventArgs e)
{
    model.DoSomething();
}

private void updateViewCollection(object sender, RunWorkerCompletedEventArgs e)
{
    // model.entries is an ObservableCollection<Entry>
    foreach (Entry en in this.model.entries) 
    {
        if (!this.Entries.Contains(en))
            this.Entries.Add(en);
    }
}

Есть ли лучший способ привязать ObservableCollection модели к ObservableCollection вида с помощью многопоточной модели представления?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2011

Посмотрите на это http://nuget.org/List/Packages/Caliburn.Micro.INPC

Он имеет базу модели представления, которая реализует измененное свойство, которое автоматически маршалирует в поток пользовательского интерфейса. есть также класс Extends ObservableCollection, который выполняет ту же функцию, называемый BindableCollection.

0 голосов
/ 18 февраля 2010

Я предполагаю, что вы используете wpf или silverlight.Вы подключаете события так же, как и в одном потоке, но перенаправляете их обратно на объект Dispatcher (Invoke ()).Предполагая, что ваша наблюдаемая коллекция является поточно-ориентированной, у вас не должно возникнуть проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...