2017-03-10 83 views
2

當我試圖在默認執行時禁用命令(即使沒有傳遞CanExecute謂詞)時,我正面臨着asny ICommand實現的奇怪行爲。異步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。當執行完成後,bool被設置,但是隻有當我點擊一個鼠標按鈕或移動鼠標或w/e後才能調用CanExecute。

現在我試着打電話給

CanExecute(null); 

mIsExecuting = false; 

,但沒有幫助也沒有。我不知道我錯過了什麼。

感謝您的幫助

編輯:

爲了澄清我添加構造該類藏漢:

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我沒有設置它,現在總是爲空 – user3292642

回答

4

在異步情況下,WPF往往不知道什麼時候來檢查CanExecute,這就是爲什麼在Icommand界面中有「CanExecuteChanged」事件。

你應該有這樣的事情在你的命令執行:

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

    remove { CommandManager.RequerySuggested -= value; } 
} 

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

有了上面的代碼,你現在可以這樣做:

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

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

    await ExecuteAsync(parameter); 
    mIsExecuting = false; 

    RaiseCanExecuteChanged (); 
} 

這會告訴WPF要刷新CanExecute狀態的命令。

+0

非常感謝(: – user3292642

+1

)與問題無關,但爲什麼(在這裏使用CommandManager)有什麼實際用途? – Fabio

+0

它被用來讓wpf知道你的具體命令,並告訴它在需要時刷新所有的CanExecute。這是Prism使用的框架,儘管我現在確實覺得它有點笨拙,下面是一個更好的解釋:https:/ /joshsmithonwpf.wordpress.com/2008/06/17/allowing-commandmanager-to-query-your-icommand-objects/ – Seb