2014-09-03 112 views
2

也許我失去了一些東西,但是我無法獲得ReactiveCommand來阻止基於canExecute observable的執行。ReactiveCommand不尊重canExecute

下面是我能夠想到的最簡單的例子。我希望命令永遠不會開火,但它是。

我錯過了什麼?

void Main() 
{ 
    var canExecute = Observable.Return(false); 
    var myCommand = ReactiveCommand.CreateAsyncTask(canExecute, m => functions.doAllThings(m)); 

    myCommand.Subscribe(x=>"executing".Dump()); 

    myCommand.Execute("Tom"); // This fires the command. I would have expected it to block 
} 

static class functions 
{ 
    public static Task doAllThings(object message) 
    { 
     var result = Task.Run(() =>{ 
        "running task...".Dump(); 
        return "hello " + (string)message;}); 

     return result; 
    } 
} 

注 - 這是一個問題是從Executing a command from another command'叉'種。我相信這更是核心問題。

回答

3

這是設計。 ReactiveUI不會阻止你明確地致電Execute/ExecuteAsync,並相信你知道你在做什麼™

+0

艾哈 - 感謝保羅。這不是我所期望的。我必須承認,我仍然不知道自己在做什麼......但是我每天都在學習:-) – 2014-09-03 09:26:18

+0

這同樣適用於您自己的ICommand實現。通常情況下,沒有人會像if(!CanExecute(null)return;在Execute方法內執行任何操作,當你可以執行時,你只希望被調用 – 0xBADF00D 2015-07-30 11:45:15

+0

@ 0xBADF00D我必須誠實,這種行爲引起了我的警惕,同樣的_does not_適用於我自己的'ICommand'實現,如果兩個方法完全獨立運行,我不會在將'CanExecute'和'Excute'行爲封裝到'ICommand'對象中看到太多價值。我可能只是將這兩種方法放到我的ViewModel中,而省去了不必要的抽象,我使用了一個命令,因爲我不相信調用者不會做一些愚蠢的事情。 – 2016-02-26 19:50:05