2016-05-03 27 views
0

CanExecuteChangedイベントハンドラに問題があります。CanExecuteChangedが正しく機能しない

私はICommandのを実装する抽象クラスがあります。

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は私に警告与えている:

を、私は、この基本コマンドを継承するコマンドを持って

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); 
} 

警告CS0108 'AddNewFilmWindowCommand.CanExecuteChanged'は継承されたメンバーを隠す 'CommandBase> .CanExeかわいいチェンジ。隠れが意図されていた場合は、新しいキーワードを使用してください。 SpravaFilmu.ViewModels

常にNULLです。このコマンドを使用してボタンをクリックすると、グレーになることはありません。

答えて

1

CommandBase抽象的にイベントを行います。

public abstract event EventHandler CanExecuteChanged; 

使用しているUIフレームワークは、おそらく約ICommandです。サブクラスはイベントをオーバーライドしないため、UIは基本クラスのイベントにバインドされます。ボタンをクリックすると、サブクラスでイベントが発生しますが、基本クラスではイベントは発生しません。基本的にここで2つのイベントがあります - UIはそれらの1つを参照しますが、もう1つは上げています。

+0

こんにちは、ありがとう、これは問題を解決:)完璧!次回はこれを覚えています! – Shadowmak

0

AddNewFilmWindowCommandは、CommandBaseを継承しています。彼らはどちらもイベントCanExecuteChangedを持っており、コマンドベースでは抽象的でも仮想的でもありません。あなたは、基本クラスからイベントを上書きすることを目的とする場合は、新しいキーワードを使用します。

public class AddNewFilmWindowCommand : CommandBase<ViewModelCollection<FilmModel>> 
{ 
    public new event EventHandler CanExecuteChanged; 
    ... 
+0

こんにちは!あなたの時間をありがとう。私はこれを試しても、結果はNULLなので、if文を渡すことはありません:(元々EventHandlerを何に設定していたのだろうか?)イベントハンドラがif文で既に設定されている別の参照プロジェクトがある。 – Shadowmak

0

あなたは、基本クラスでイベントを発生させることができない...しかし、あなたはこれを行うに保護されたメソッドを持っている可能性が...そうCommandBase追加で:ちょうど、あなたの実装で

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

そして、イベントを宣言しないでください。

public override void Execute(object item) 
{ 
    this.ViewModel.NewItem = new FilmModel(); 
    RaiseCanExecuteChanged(); 
} 
関連する問題