CanExecuteChanged无法正常工作

时间:2016-05-03 19:00:55

标签: c#

我遇到CanExecuteChanged事件处理程序的问题。

我有一个实现ICommand的抽象类:

public abstract class CommandBase<TViewModel> : ICommand
{
    protected TViewModel ViewModel { get; set; }

    public event EventHandler CanExecuteChanged;

    protected CommandBase(TViewModel viewModel)
    {
        this.ViewModel = viewModel;
    }

    public virtual bool CanExecute(object parameter)
    {
        return true;
    }

    public abstract void Execute(object parameter);
}

然后我有一个继承自这个基本命令的命令:

public class AddNewFilmWindowCommand : CommandBase<ViewModelCollection<FilmModel>>
{
    public event EventHandler CanExecuteChanged;
    public AddNewFilmWindowCommand(ViewModelCollection<FilmModel> viewModelCollection)
        : base(viewModelCollection)
    {
    }

    public override void Execute(object item)
    {
        this.ViewModel.NewItem = new FilmModel();

        var onCanExecuteChanged = this.CanExecuteChanged;
        if (onCanExecuteChanged != null)
        {
            onCanExecuteChanged(this, new EventArgs());
        }
    }

    public override bool CanExecute(object parameter)
    {
        if (this.ViewModel.NewItem == null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

但CanExecuteChanged正在给我警告:

  

警告CS0108'AddNewFilmWindowCommand.CanExecuteChanged'隐藏继承的成员'CommandBase&gt; .CanExecuteChanged'。如果要隐藏,请使用new关键字。 SpravaFilmu.ViewModels

并且始终为null。使用此命令单击按钮后,它永远不会变灰。

3 个答案:

答案 0 :(得分:1)

CommandBase摘要制作活动。

    public abstract event EventHandler CanExecuteChanged;

您正在使用的UI框架可能只知道ICommand。由于您的子类不会覆盖该事件,因此UI将绑定到基类中的事件。单击该按钮时,它将在子类中引发事件,但不会引发基类。基本上你在这里有2个事件 - 用户界面引用了其中一个事件,但你正在筹集另一个事件。

答案 1 :(得分:0)

class MyTest(django.test.TransactionTestCase): # or django.test.TestCase fixtures = ['data1.json', 'data2.json', 'data3.json'] def test1(self): return # I simplified it to just this for now. def test2(self): return # I simplified it to just this for now. 继承自AddNewFilmWindowCommand。它们都具有事件CommandBase,并且在命令库中它不是抽象的或虚拟的。如果您打算从基类覆盖事件,请使用new关键字:

CanExecuteChanged

答案 2 :(得分:0)

你不能在基类中引发一个事件......但你可以有一个受保护的方法来这样做......所以在CommandBase添加:

protected void RaiseCanExecuteChanged()
{
  CanExecuteChanged?.Invoke(this, new EventArgs());
}

然后在您的实现中,只是不要声明事件,并将其称为:

public override void Execute(object item)
{
  this.ViewModel.NewItem = new FilmModel();
  RaiseCanExecuteChanged();
}