私のアプリケーションは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
を使用する必要があります。しかし、私が正しい方向にいるかどうかはわかりません。
はい、これはトリックでしたが、私はCanExecuteがRelayCommandによって何らかの形で観測可能であると思っていました。変更を 'Set'で伝える必要があります。 – Pablo
ICommandからのイベントCanExecuteChangedがUIによって観察され、UIが呼び出されると、UIはボタンを有効または無効にするかどうかを判断するためにCanExecuteを再クエリします(またはコマンドにバインドされているもの)。 –
私はまだそれが "箱の外"で動作しない理由を理解したい。これは、コマンドの実行に応答してボタンを有効/無効にする非常に一般的なパターンです。 'CanExecuteChanged'は' RaiseCanExecuteChanged'によって呼び出されますが、これは明らかです。しかし、私の意見では、canExecute自体を変更する必要があります。 srcコードの 'RelayCommand'の上に次のコメントがあります:'重要:閉鎖はWeakActionsの使用により現時点ではサポートされていません。あなたはそれが関連していると思いますか? – Pablo