有时当我将命令绑定到ViewModel时,我的CanExecute代码并不总是被调用,因此我的按钮不会被禁用。
有什么想法吗?
由于
答案 0 :(得分:1)
当canExecute未被称为第一次时,这是一个绑定问题。
如果不是第二次“自动”调用,那么这就是正常行为。
想象一下,用户界面应该如何知道它应该重新查询你的谓词?当你有一个命令参数时,它会在每次参数更改时调用你的谓词。一般来说,一些UI'事件'也会重新查询它(焦点,updatelayout等),但并不总是(这很好,重新评估所有时间的每个命令都是没有意义的)。所以你不能依赖它。您创建业务逻辑,因此您知道何时需要更新,而不是UI。用户界面'无法在您的谓词委托中查看',并观察会发生什么。您必须通知关于它的用户界面,与属性更改时通知相同。
ICommand 有一个事件,所以你必须实现它,它是 CanExecuteChanged 。
你应该实现一个公共方法来激活它(或者如果你使用一个框架,如MVVMLight或Prism,它已经实现了。)
一个简单的实现。
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
因此,只要您的业务逻辑中的canExecute状态发生变化,您就可以在命令中调用它,并且通知所有订阅者,这是您的按钮情况下。
答案 1 :(得分:0)
您提到按钮的状态未被禁用。这似乎更像是绑定问题而不是绑定到命令。您绑定的属性的状态是否发生变化?什么时候改变等等?