我遇到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。使用此命令单击按钮后,它永远不会变灰。
答案 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();
}