Контроль обновления событий Wpf Prism - PullRequest
0 голосов
/ 30 марта 2012

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

   <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);
        }

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

Любой

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

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

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

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 голосов
/ 31 марта 2012

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

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

_eventAggregator.GetEvent<PublishStatusEvent>().Subscribe(this.OnStatusChanged, ThreadOption.UIThread);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...