2012-03-30 2 views
0

У меня есть стандартный Listbox, который связан со свойством в моей ViewModelWpf Prism управление обновлением событий

<ListBox ItemsSource="{Binding StatusList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Name="myListBox" BorderThickness="0" HorizontalAlignment="Stretch">   
       </ListBox> 

Свойства

private ObservableCollection<String> _statusList; 
     public ObservableCollection<String> StatusList 
     { 
      get { return _statusList;} 
      set { _statusList = value;} 
     } 

Вид модель подписывается на событие

_eventAggregator.GetEvent<PublishStatusEvent>().Subscribe(this.OnStatusChanged); 

, который исключает функцию, которая просто добавляет строки в коллекцию

private void OnStatusChanged(string status) 
     { 
      StatusList.Add(status); 
     } 

Когда я выполняю длинную задачу, которая публикует события, я хочу, чтобы список обновлялся. Если я отлаживаю, я могу видеть события, но список не обновляется, пока задача не будет завершена. Задача инициализируется в viewmodel.

Кто-нибудь?

+0

Является ли «длительная работа» отдельной веткой? – Phil

+0

Я не уверен, вы можете попробовать '_statusList.Add (status)' –

+0

Разница в кистях, такая же проблема – klashagelqvist

ответ

1

Я предполагаю, что ваш «длинный бег задача» на самом деле работает в потоке пользовательского интерфейса и, следовательно, блокируя поток пользовательского интерфейса, даже если вы успешно публикации и подписки события. Это объясняет, почему все события появляются, когда задача завершается.

Попробуйте переместить задачу на другой поток, может быть что-то вроде этого:

public class MyViewModel 
{ 
    private readonly IEventAggregator _aggregator; 

    public MyViewModel(IEventAggregator aggregator) 
    { 
     _aggregator = aggregator; 
     var tf = new TaskFactory(); 
     tf.StartNew(SendStatusMessages); 
    } 

    private void SendStatusMessages() 
    { 
     for (int i = 0; i < 50; i++) 
     { 
      Thread.Sleep(1000); 

      var s = "item: " + i; 
      Debug.WriteLine("Sending" + s); 
      _aggregator.GetEvent<StatusEvent>().Publish(s); 
     } 
    } 

Затем вам нужно будет изменить код подписки, как это было предложено @shriek, к

_aggregator.GetEvent<PublishStatusEvent>().Subscribe(
    OnStatusChanged, ThreadOption.UIThread); 

Тот факт, что вы не указали ThreadOption.UIThread и не получали исключение потока при добавлении элемента в список состояния, также указывает, что ваша задача в данный момент находится в потоке пользовательского интерфейса.

0

Вы снимаете событие из фоновой темы? Если да, это может объяснить, почему вы не видите никаких обновлений.

Что может помешать помещению события в поток пользовательского интерфейса, вам просто нужно немного изменить вызов на Subscribe.

_eventAggregator.GetEvent<PublishStatusEvent>().Subscribe(this.OnStatusChanged, ThreadOption.UIThread); 
Смежные вопросы