2017-03-10 24 views
2

私はコマンドを無効にしようとしたときに、私の偽の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); 
} 
+0

「Execute」はどこで再生されますか? – Petaflop

+0

'CanExecutePredicate'をいつどこで設定しますか? –

+0

@ AlessandroD'Andria私はそれを設定しません、今のところは常にNULLです – user3292642

答えて

4

は、WPFは、CanExecuteをチェックする際に知っていない傾向がありますそのため、Icommandインターフェイスに「CanExecuteChanged」イベントがあります。

あなたは、コマンドの実装では、このようなものが必要です:これは、あなたがCanExecute状態をリフレッシュしたいWPFを教えてくれます

public async void Execute(object parameter) 
{ 
    mIsExecuting = true; 

    RaiseCanExecuteChanged (); // Not necessary if Execute is not called locally 

    await ExecuteAsync(parameter); 
    mIsExecuting = false; 

    RaiseCanExecuteChanged (); 
} 

:あなたは今、これを行うことができます上記のコードでは

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 

    remove { CommandManager.RequerySuggested -= value; } 
} 

public void RaiseCanExecuteChanged() 
{ 
    CommandManager.InvalidateRequerySuggested(); 
} 

をコマンドの。

+0

本当にありがとうございます(: – user3292642

+1

質問には関係ありませんが、ここでは 'CommandManager'を使う理由(実際の目的は何ですか?) – Fabio

+0

これは、wpfがあなたの具体的なコマンドを認識し、必要に応じてCanExecuteをリフレッシュするように指示するために使用されます。 /joshsmithonwpf.wordpress.com/2008/06/17/allowing-commandmanager-to-query-your-icommand-objects/ – Seb

関連する問題