2016-05-04 12 views
0

私のアプリケーションはMVVM Lightツールキットを使用しています。ボタンの状態がRelayCommandを使用して更新されない

private RelayCommand _buttonCommandNew; 
    public RelayCommand ButtonCommandNew 
    { 
     get 
     { 
      var worker = new TCService(); 
      return _buttonCommandNew 
        ?? (_buttonCommandNew = new RelayCommand(async() => 
        { 
         var progress = new Progress<string>(status => 
         { 
          ProgressText = status; 
         }); 

         await worker.GenerateConfiguration(1, "", "", progress); 
        },() => !worker.InProgress 
       )); 
     } 
    } 

これはサービスです::これはXAMLでボタンにバインドされているコマンド、あるサービスの開始が動作するとき

class TCService : ITCService 
{ 
    public Task<bool> GenerateConfiguration(int cellCount, string templateFilePath, string outputFilePath, IProgress<string> progress) 
    { 
     return Task.Run(() => RunConfigurator(progress)); 
    } 

    public bool InProgress { get; private set; } 

    private bool RunConfigurator(IProgress<string> progress) 
    { 
     InProgress = true; 
     Thread.Sleep(6000); 
     progress.Report("Yeah!"); 
     InProgress = false; 
     return true; 
    } 
} 

は、私は何を達成したいことは、ボタン無効にされており、最後に有効にしてください。現在の実装ではこれは起こりません。さらに重要なことは、MVVM Lightに準拠させることです。私は私のサービスがMVVM Lightの基本クラスの1つから継承されるべきであると感じ、変更についてUIに通知するためにSetを使用する必要があります。しかし、私が正しい方向にいるかどうかはわかりません。

答えて

0

InProgressプロパティはビューモデル(ButtonCommandNewプロパティを含むクラス)に移動でき、UIにバインドされています。

その後、InProgressプロパティのセッターでは、UIが_buttonCommandNewRelayCommandCanExecuteを呼び出し、したがって、有効またはInProgressの値に応じてUIのボタンを無効にすることを通知するために起こっているButtonCommandNew.RaiseCanExecuteChangedを呼び出すことができますプロパティ。あなたはworker.GenerateConfigurationを呼び出してから、あなたがメソッドを呼び出し終わった後falseにそれをリセットする前trueInProgressプロパティを設定する必要があります。この場合

+0

はい、これはトリックでしたが、私はCanExecuteがRelayCommandによって何らかの形で観測可能であると思っていました。変更を 'Set'で伝える必要があります。 – Pablo

+0

ICommandからのイベントCanExecuteChangedがUIによって観察され、UIが呼び出されると、UIはボタンを有効または無効にするかどうかを判断するためにCanExecuteを再クエリします(またはコマンドにバインドされているもの)。 –

+0

私はまだそれが "箱の外"で動作しない理由を理解したい。これは、コマンドの実行に応答してボタンを有効/無効にする非常に一般的なパターンです。 'CanExecuteChanged'は' RaiseCanExecuteChanged'によって呼び出されますが、これは明らかです。しかし、私の意見では、canExecute自体を変更する必要があります。 srcコードの 'RelayCommand'の上に次のコメントがあります:'重要:閉鎖はWeakActionsの使用により現時点ではサポートされていません。あなたはそれが関連していると思いますか? – Pablo

関連する問題