【发布时间】:2014-06-25 06:29:16
【问题描述】:
我正在学习 Mvvmlight,对 RelayCommand 的 canExecute 感到很困惑。
基本上,我在view 中有一个Button 和一个PasswordBox,在viewModel 中有一个Command。如果密码框为空,我想要禁用按钮。我的解决方案是将 PasswordBox 作为 CommandParemeter 传递给 Button,然后在 canExecute 方法中接收 PasswordBox 并指定它是 null 还是空。我首先声明一个命令:
public ICommand CommandClear { get; private set; }
然后在Class Constructor中实例化它:
CommandConfirm = new RelayCommand<object>((p) => ConfirmExecute(p), (p) => ConfirmCanExecute(p));
最终实现canExecute方法如下:
private bool ConfirmCanExecute(object parameter)
{
bool isExecuable = false;
var passwordBox = parameter as PasswordBox;
if (!string.IsNullOrEmpty(passwordBox.Password))
isExecuable = true;
return isExecuable;
}
上面的 canExecute 方法不起作用,因为 System.Reflection.TargetInvocationException 会在 PresentationFramework.dll 中抛出未处理的异常。
所以我尝试用try...catch包装上面的代码。这一次,它像魔术一样工作:
try
{
var passwordBox = parameter as PasswordBox;
if (!string.IsNullOrEmpty(passwordBox.Password))
isExecuable = true;
return isExecuable;
}
catch
{
return isExecuable;
}
我对@987654336@的这种行为感到很困惑,有什么想法吗?
【问题讨论】:
-
那么我是否能以正确的方式完成工作?我不明白为什么在之前的
canExecute方法中会抛出异常。 -
您是否检查过 PasswordBox 是否已正确传递给您的
canExecute方法?您的方法中唯一看起来可能引发异常的地方是passwordBox.Password,因为您没有检查passwordBox是否为空。
标签: c# mvvm-light relaycommand canexecute