2016-03-30 4 views
0

更新されない:、ReactiveCommand:CanExecuteは私がViewModelにのコンストラクタ内ReactiveCommand作成しようとしています

IObservable<bool> canExecute = this 
    .WhenAnyValue(x => x.InsertableItems, x => x.IsRefreshing, 
    (insertableItems, isRefreshing) => !isRefreshing && insertableItems > 0); 

canExecute.Subscribe(x => this.Logger.LogInformation("Can execute changed: {0}", x)); 

this.ConvertCmd = ReactiveCommand.CreateAsyncTask(canExecute, ConvertCmdExecute); 

ConvertCmdはその後、私のGUIでボタンのCommandプロパティにバインドされているが

<Button Content="Convert" Command="{Binding ConvertCmd, Mode=OneWay}" /> 

しかし、GUIのボタンがグレーアウトされたままと決して注意することが

いくつかのことを有効になります:

  • 私のロガーでは、最新の/最後の値がTrue(期待どおり)である「Can execute execute changed ...」といういくつかの更新を見ています。だから、私のIObservable canExecuteは正しい、期待される値のシーケンスを作成しているようだ。最終的に真で終わるシーケンス。
  • ReactiveCommand.CreateAsyncTask(ConvertCmdExecute)を使用してコマンドを作成すると、つまりcanExecuteパラメータを省略すると、ボタンが有効になり、ClickでConvertCmdExecuteを期待どおりに実行します。だから、データバインディング自体のように思えます。

私はここで紛失しています。元のシナリオでボタンが有効にならない理由を知っている人はいますか?

答えて

0

いつものように、問題に時間を過ごした後、私はこれを掲示した後、私自身の答えだけの瞬間を見つけるこれは、スレッドの問題だったように...

は思えます。 サブスクリプションは、未知の潜在的に変化するスレッドで実行されました。以下はコードを修正したものです。正直言っても、ディスパッチャー上で実行する必要がある理由が完全にはわかりません。

+1

UIスレッド以外のスレッドが 'InsertableItems'または/または' IsRefreshing'を設定しているためです。 – Aron

関連する問題