2014-09-25 112 views
0

我认为这有一个特定的答案。CanExecute中应该包含哪些内容?

如果我有一个命令结合

private bool CanExecute(Object args){ 
    // Should this just be null checks? 
    // Should it also contain logic? 
    // example: 

    return this.SelectedObject != null; 

    // or 

    return this.SelectedObject != null && this.SelectedObject.Status == 1; 
} 

private void Executed(Object args){ 

    //Or should logic be reserved for the Executed command 

    if(this.SelectedObject.Status == 1) 
    //Do stuff 
    else 
    //Don't do stuff 
} 

这似乎是多余的有一个可以执行的方法,如果我们的执行方法中做更多的数据验证。

+1

将其他方法中的数据验证内容移到'CanExecute()'中? – DGibbs 2014-09-25 12:00:11

+0

'我知道这似乎主要是基于意见'和'但我认为这是一个具体的答案'这两个完全不同的东西:) – Shaharyar 2014-09-25 12:00:57

+0

@Shaharyar我正在寻找像约翰Skeet的人来衡量,并说如果有一个工业标准。 – 2014-09-25 12:01:34

回答

2

如果您的命令的逻辑假定它不能被执行,当某些条件满足时,那么CanExecute必须检查这些条件。

否则,CanExecute必须返回true。

这并不重要,条件的本质是什么,但您应该注意,长时间运行的检查可能会影响UI线程的性能。

+1

这也是我的关注点。由于CanExecute似乎不断开火,我会担心任何带有沉重开销的情况 – 2014-09-25 12:09:54

+0

@AnthonyRussell:那么,你有什么困惑? – Dennis 2014-09-25 12:13:56

+0

我只是想知道是否有一个行业标准,如果只有空检查或其他原始检查应在CanExecute中进行,或者如果可以接受将复杂条件逻辑放在那里 – 2014-09-25 12:15:05

2

我看到的方式是区分是否会发生某种情况,以及是否应该发生某些情况。

一个这样的例子可以是保存按钮或其他东西。用户可能无权保存实体,因此操作无法进行。

如果用户确实有权限,则所有必填字段可能不会填写,因此它不应该发生。

它在语义上。

+0

很好的答案!我想指出的是,让CanExecute()也允许控件的状态由生成的布尔值来设置 - 这是一件很好的事情。 – 2014-09-25 12:07:41

相关问题