Список привязок wpf mvvm <int>к списку из фонового потока - PullRequest
0 голосов
/ 12 мая 2011

Я довольно новичок в wpf и mvvm, так что это может быть простой вопрос, но я надеюсь, что кто-нибудь сможет мне это объяснить.В моей модели есть класс, который выполняет только опросы процессов, и если он видит, что «calc» запущен, он добавляет идентификатор процесса в список.Если вы закроете calc.exe, он удалит его из списка.Если список изменится, то сработает и событие.В моей ViewModel я подписываюсь на это событие и обновляю свое свойство, которое запускает PropertyChanged.Теперь, если мое свойство представляет собой список в модели представления, тогда моя привязка в моем представлении не обновляется правильно.Если я изменил свой список на ObservableCollection в моей модели и ViewModel, то я получаю проблему перекрестного потока.Однако, если я оставляю свой Список в моей модели и изменяю свое свойство в моей ViewModel на ObservableCollection и копирую значения списка в наблюдаемую коллекцию, все работает как ожидалось .... Я не понимаю, действительно ли янужно сделать копию, чтобы привязка в моем ListBox работала правильно?

Ответы [ 3 ]

0 голосов
/ 13 мая 2011

Лучший способ реализовать эту функциональность - открыть модель через свойство в ViewModel и связать ListBox с Model.ObservableList.И используйте предложение Джона при добавлении и удалении элементов в этом списке.Это не потребует от вас скопировать значения из списка в наблюдаемую коллекцию.

Таким образом, ваш код viewModel должен иметь значение

    public class ViewModel
    { 
        public Model Model { get { return _model; } }
    }

Привязка в xaml:

    <ListBox ItemsSource=Model.ObservableList/>

где свойство ObservableList возвращает вашу коллекцию ObservableCollection.

Поскольку все элементы пользовательского интерфейса в WPF имеют привязку к потоку (к потоку Dispatcher), любые обновления пользовательского интерфейса следует маршалировать с помощью Dispatcher.Вы можете сортировать вызовы через Dispatcher, используя Dispatcher.Invoke.В этом случае ваши view, viewModel и Model находятся в потоке Dispatcher, поэтому любой вызов для обновления пользовательского интерфейса через viewModel или Model потребует от вас вызова Dispatcher.Invoke.

0 голосов
/ 13 мая 2011

Взгляните на DispatcherNotifiedObservableCollection, который реализует Cinch.При необходимости он будет автоматически использовать диспетчер.Прочтите эту статью, чтобы увидеть код для этого:

http://www.codeproject.com/KB/WPF/CinchIII.aspx#ObsCol

0 голосов
/ 12 мая 2011

Вам необходимо обновить наблюдаемую коллекцию из потока рассылки.

Нечто подобное (не технически / синтаксически правильное, но псевдо-близкое)

Dispatcher.BeginInvoke( () => theList.Add( theThing ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...