我在Command-ViewModel中缺少什么吗?
public class Command : ICommand
{
public Command(Action execute, Func<bool> canExecute = null)
{
this.execute = execute;
this.canExecute = canExecute ?? new Func<bool>(() => true);
}
private Action execute;
private Func<bool> canExecute;
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return canExecute.Invoke();
}
public void Execute(object parameter)
{
execute?.Invoke();
}
}
每次我想在CanExecuteChanged
的代码行MainViewModel
中使用((Command)MyCommand).CanExecuteChanged();
时,都会出现此错误The event 'Command.CanExecuteChanged' can only appear on the left hand side of += or -=
答案 0 :(得分:3)
CanExecuteChanged
是一个事件。您只能像这样使用它:
YourCommand.CanExecuteChanged += (sender, args) =>
{
// Do your magic here
};
答案 1 :(得分:0)
要回答您的问题,是的,您的代码中缺少某些内容。我不知道您是否正在使用Command
提供的Xamarin.Forms
类,但是如果您不使用,那么您确实应该这么做!
除了订阅事件通知外,最终您无法与它所属的类之外的event
进行交互,这是事件'Command.CanExecuteChanged'只能出现在事件的左侧的原因。 + =或-='告诉您。要订阅,请实现以下内容:
MyCommand.CanExecuteChanged += (sender, e) =>
{
// Your code to react to the event goes here.
};
尽管可以做什么,但是这是您需要使用Xamarin.Forms
Command
类的地方(或者您可以在Command
类中实现类似的操作)。是呼叫ChangeCanExecute
,例如
((Command)MyCommand).ChangeCanExecute();
这将触发事件被触发,从而更新绑定到该命令的所有UI控件。
答案 2 :(得分:0)
public event EventHandler CanExecuteChanged;
是语法糖。放入时,编译器实际生成的内容类似于*
private EventHandler _CanExecuteChanged;
public event EventHandler CanExecuteChanged
{
add { _CanExecuteChanged += value; }
remove { _CanExecuteChanged -= value; }
}
所以公开显示的CanExecuteChange
不是实际字段,而是可以用来添加和删除处理程序的内容。
相关说明:private
的后备字段也是在基类中使用protected
OnXXXX()方法的正常模式的原因。
public event EventHandler CanExecuteChanged;
protected void OnCanExecuteChanged(EventArgs args)
{
CanExecuteChanged?.Invoke(this, args);
}
*请注意“喜欢”部分;正确添加和删除也需要进行一些null检查。
答案 3 :(得分:0)
我删除了Command-Class
,现在使用的是Xamarin.Forms Command Class
,这使操作变得容易得多,因为现在我可以使用以下简短的代码行:((Command)MyCommand).ChangeCanExecute();
来触发事件。
谢谢大家。
答案 4 :(得分:0)
只是另一种方法!
public sealed class Command : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
public RelayCommand(Predicate<object> CanExecute, Action<object> Execute)
{
_canExecute = CanExecute;
_execute = Execute;
}
public bool CanExecute(object parameter)
{
return _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
}
然后让命令管理器处理更新您的 .CanExecuteChanged
问题:)
如果您需要强制命令管理器“再次查看”,请调用 CommandManager.InvalidateRequerySuggested();
这里有更多关于命令管理器的信息 How does CommandManager.RequerySuggested work?