2012-01-08 4 views
0

Reactive ExtentionsとMVVM Light Toolkitを使用してUIスレッドに戻ることができません。Rx、MVVM Light、およびSilverlightを使用してUIスレッドに戻ることができません

private ObservableCollection<Workspace> _workspaces; 
    public ObservableCollection<Workspace> Workspaces 
    { 
     get 
     { 
      return _workspaces; 
     } 
     set 
     { 
      if (_workspaces == value) 
       return; 

      _workspaces = value; 

      RaisePropertyChanged("WorkspacesLoaded"); 

     } 
    } 

    public bool WorkspacesLoaded 
    { 
     get 
     { 
      if (_workspaces != null && _workspaces.Count > 0) 
       return true; 

      return false; 
     } 
    } 

お知らせUIに到着すると思われることはありませんRaisePropertyChanged("WorkspacesLoaded");

私はViewModelににフォロープロパティを得ました。

次のコードは、Subject<Workspace>を購読し、.ObserveOnDispatcher()を読んだところから、UIスレッドに戻ってきます。

 _workspaceSubscription = _workspaceSource.WorkspaceMutations 
      .ObserveOnDispatcher() 
      .SubscribeOn(Scheduler.ThreadPool) 
      .Subscribe(OnNewWorkspaceMutation, OnWorkspaceMutationError); 

     _workspaceSource.GetWorkspaces(); 

そして、このコードはWorkspacesプロパティに追加します。

private void OnWorkspaceCreated(Workspace workspace) 
    { 
     Workspaces.Add(workspace); 
    } 

これは私をバッフルものです:Workspacesコレクションが適切に人口取得し、UIが正しくに結合します。しかし、私が設定したブレークポイントをWorkspacesに設定すると、決してヒットしないので、ObservableストリームがUIスレッドに返されないという疑いがあります。

ご協力いただければ幸いです。

答えて

1

Workspacesコレクションに追加するため、実際にはコレクションプロパティを再度設定しないためです。

Workspaces = new ObservableCollection<Workspace>(); 

この場合、wokrspaceプロパティの設定がトリガーされています。今ではすでに存在している値だけを使用します。ゲッターにブレークポイントを設定すると、ヒットします。

+0

あなたはそうです!私がセッターを引き受けることの大きな間違いは打撃を受けるだろう。私が混乱したのは、ViewModelのコンストラクタで.Addを実行したときに必要な動作があったからですが、これはUIがまだプロパティにバインドされていないためです。 – ndsc

関連する問題