事件“ Command.CanExecuteChanged”只能出现在+ =或-=的左侧

时间:2018-08-10 06:21:25

标签: c# xamarin.forms

我在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 -=

5 个答案:

答案 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?