Wpf Prism事件更新控制

时间:2012-03-30 10:08:47

标签: wpf prism

我有一个标准的列表框,它绑定到我的viewmodel

中的属性
   <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中启动。

任何?

2 个答案:

答案 0 :(得分:1)

我猜你的'长时间运行的任务'实际上是在UI线程上运行,因此即使您成功发布和订阅事件,也会阻止UI线程。这可以解释为什么在任务完成时所有事件都会出现。

尝试将您的任务移动到另一个线程,可能是这样的:

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且未获得线程异常的事实也表明您的任务当前位于UI线程上。

答案 1 :(得分:0)

您是否从后台线程中触发了该事件?如果是,那可能解释了为什么您没有看到任何更新。

尝试将事件放在UI线程上可能会有所帮助,您只需稍微修改对Subscribe的调用。

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