私はコマンドを無効にしようとしたときに、私の偽のICommandの実装によって、(たとえCanExecute述語が渡されなくても)奇妙な動作に直面しています。非同期のICommandの実装
public bool CanExecute(object parameter)
{
if (CanExecutePredicate == null)
{
return !mIsExecuting;
}
return !mIsExecuting && CanExecutePredicate(parameter);
}
public async void Execute(object parameter)
{
mIsExecuting = true;
await ExecuteAsync(parameter);
mIsExecuting = false;
}
プライベートブールを導入しようとしましたが、これは実行する直前にtrueに設定し、その後はfalseに設定しました。実行が終了するとブールが設定されますが、CanExecuteはマウスボタンをクリックするか、マウスまたはw/eを動かすと呼び出されます。
は今、私は
mIsExecuting = false;
後
CanExecute(null);
を呼び出そうとしましたが、それはどちらも助けにはなりません。私は何が欠けているのかわかりません。
私は、このクラスのaswellのコンストラクタを追加明確にする:あなたの助け
EDITため
おかげで非同期のシナリオで
public AsyncRelayCommand(Func<object, Task> execute)
: this(execute, null)
{
}
public AsyncRelayCommand(Func<object, Task> asyncExecute,
Predicate<object> canExecutePredicate)
{
AsyncExecute = asyncExecute;
CanExecutePredicate = canExecutePredicate;
}
protected virtual async Task ExecuteAsync(object parameter)
{
await AsyncExecute(parameter);
}
「Execute」はどこで再生されますか? – Petaflop
'CanExecutePredicate'をいつどこで設定しますか? –
@ AlessandroD'Andria私はそれを設定しません、今のところは常にNULLです – user3292642