2014-09-03 195 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