我正在开发Xamarin Android Application。我不想执行Mvxcommand虽然它是Executing.What是什么解决方案?
我的代码是:
var asd = Mvx.Resolve<MyAddressesViewModel> ();
asd.ItemSelect.CanExecute (false);
答案 0 :(得分:0)
调用ChangeCanExecute()方法。
答案 1 :(得分:0)
您可以在创建命令实例时传入委托(可能是MvxCommand
中的MyAddressesViewModel
。
所以可能是这样的:
class MyAddressesViewModel
{
public ICommand ItemSelect
{
get
{
return new MvxCommand(
() => {}, // Delegate when command gets invoked
() => true); // Delegate to determine CanExecute
}
}
}
或类似的东西。
另请注意,正如Dhruv所提到的那样,您需要触发命令的PropertyChanged事件,并使用ChangeCanExecute
方法实际调用您在构造函数中注册的CanExecute
委托。
答案 2 :(得分:0)
您应该为您的MvxCommand提供一个委托,该委托将被调用以确定用户是否可以执行该命令。您还应该告诉Mvvm Cross何时使用CanExecute
手动更新RaiseCanExecuteChanged
状态。
以下示例为您提供“登录”按钮,该按钮仅在用户填写了EmployeeId且用户当前未尝试登录时启用:
(视图模型):
private bool _signInAttemptInProgress;
protected bool SignInAttemptInProgress
{
get { return _signInAttemptInProgress; }
set
{
_signInAttemptInProgress = value;
SignInCommand.RaiseCanExecuteChanged();
}
}
private string _employeeId;
public string EmployeeId
{
get { return _employeeId; }
set
{
_employeeId = value;
RaisePropertyChanged(() => EmployeeId);
SignInCommand.RaiseCanExecuteChanged();
}
}
private MvxCommand _signInCommand;
public IMvxCommand SignInCommand
{
get { return _signInCommand ?? (_signInCommand = new MvxCommand(async () => await OnSignInCommand(), CanExecuteSignInCommand)); }
}
private bool CanExecuteSignInCommand()
{
return !SignInAttemptInProgress && !string.IsNullOrEmpty(EmployeeId);
}
private async Task OnSignInCommand()
{
SignInAttemptInProgress = true;
// Do stuff here. The user can't click the SignIn command inside here.
SignInAttemptInProgress = false;
// The user can click the SignIn command again below here.
}
使用自己的IMvxCommand
实现会阻止自己在当前正在执行时再次执行,这样会更加清晰。然后,您不需要使用额外的SignInAttemptInProgress
样式属性来丢弃ViewModel。