要了解如何使用CanExecute
,请查看 Silverlight 或 WPF - 有很多博客讨论如何使用ICommand
- 例如http://weblogs.asp.net/nmarun/archive/2009/12/02/using -icommand-silverlight-4.aspx或http://blog.galasoft.ch/archive/2009/09/26/using-relaycommands-in-silverlight-and-wpf.aspx
一个例子是这样的:
private MvxRelayCommand _disconnectCommand;
public IMvxCommand DisconnectCommand
{
get
{
if (_disconnectCommand == null)
_disconnectCommand = new MvxRelayCommand(this.GetService<IConnectionService>().Disconnect, item => this.IsItemConnected(item));
return _disconnectCommand;
}
}
private void SomeServiceNotificationHandler()
{
_disconnectCommand.RaisePropertyChanged();
}
private bool IsItemConnected(object thing)
{
return /* your code */;
}
不过有一个小问题......
CanExecute
并没有真正在所有平台上的所有 MvxBindings 上完全实现......它适用于其中一些,但对于其中一些它不会 - 我真的不知道目前哪些!如果您遇到问题,请让我知道(通过 GitHub 问题),他们会得到解决...
就个人而言......我不倾向于使用CanExecute
- 我倾向于使用单独的布尔属性,然后我将其绑定到控件上可用的任何属性 - 例如,大多数控件都有类似Enabled
, IsEnabled
, Disabled
,IsDisabled
等的东西。
我通常发现设置布尔属性而不是调用更容易(并且更具可读性)RaiseCanExecuteChanged
例如我会使用类似的东西:
<Button
android:id="@+id/ButtonConnect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Disconnect"
local:MvxBind="{'Click':{'Path':'DisconnectCommand'},'Enabled':{'Path':'UsbConnected'}}" />
您可以肯定地说该CanExecute
方法具有优势 - 因为它将 Command 逻辑全部保存在一个对象中,并且因为它可用于防止Execute
在RelayCommand
. CanExecute
这就是为什么我很高兴在我们发现 mvvmcross 绑定时尝试修复它们。