2012-03-30 15 views
0

私は私のviewmodelWPFプリズムイベント更新制御

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

イベントを公開する長時間実行されるタスクを実行するとき、リストボックスを更新する必要があります。私はイベントが来るのを見ることができますが、リストボックスはタスクが終了するまで更新されていないことをデバッグする場合。タスクは、ビューモデル内で開始されます。

誰でも?

+0

「長期実行タスク」は別のスレッドにありますか? – Phil

+0

私はよく分かりません、 '_statusList.Add(状況)'を試すことができます –

+0

違い、同じ問題 – klashagelqvist

答えて

1

私はあなたの「長い実行中のタスクは、」実際にUIスレッド上で実行されているので、あなたが正常に公開し、イベントをサブスクライブしているにもかかわらず、UIスレッドをブロックしていることを推測しています。これは、タスクが完了したときにすべてのイベントが表示される理由を説明します。

このような何か多分、別のスレッドにあなたのタスクを移動してみてください:

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

に、

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により示唆されるようにあなたは、その後、サブスクリプションのコードを変更する必要があります事実をThreadOption.UIThreadを指定せず、ステータスリストにアイテムを追加するときにスレッド例外が発生していないということは、あなたのタスクが現在UIスレッド上にあることを示します。

0

イベントをバックグラウンドスレッドから発していますか?はいの場合は、更新が表示されない理由を説明している可能性があります。

UIスレッドにイベントを入れようとすると、ちょっとだけSubscribeへの呼び出しを変更する必要があります。

_eventAggregator.GetEvent<PublishStatusEvent>().Subscribe(this.OnStatusChanged, ThreadOption.UIThread); 
関連する問題