3

Josh Smithの記事からRelayCommandのコードをコピーしているときに、次のコードをコピーしました

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

次に、SOでこの回答を読んだ後、PrismのDelegateCommandクラスから次のコードをクラスにコピーしました。

protected void NotifyCanExecuteChanged()
{
    if (CanExecuteChanged != null)
    {
        CanExecuteChanged(this, EventArgs.Empty);
    }
}

しかし、彼はNotifyCanExecuteChangedメソッドでエラーを出しました

イベント「CanExecuteChanged」は、+=または-=の左側にのみ表示されます。

イベントから追加と削除のオーバーロードを削除しても、このエラーは発生しません。誰かが私がこの背後にある理由を理解するのを手伝ってくれますか?

4

3 に答える 3

2

addフィールドのようなイベント( /のない単純なフォームの名前であり、またはremoveを実行すると、はタイプのデリゲートフィールドであるバッキングフィールドを参照します。デリゲートフィールドを呼び出すことができます。ただし、あなたの例ではそうではありません。なぜなら、呼び出すべき明白なものがないからです。確かにローカルフィールドはなく、転送されたイベント()は本質的に「呼び出し」機能を公開しません。if(CanExecuteChanged != null)CanExecuteChanged(this, ...)CanExecuteChangedEventHandlerCommandManaged.RequerySuggested

基本的に、それが機能するには、呼び出しメカニズムにアクセスする必要があります。最も一般的には、次の形式をとることを期待します。

CommandManager.OnRequerySuggested();

ただし、このイベントを呼び出すメソッドがある場合(およびその必要はありません)、それはとでも呼び出すことができます。

(これOn*は、「このイベントを発生させる」APIの一般的なパターンです。二重に-多形の場合)

于 2012-10-16T10:54:59.367 に答える
1

CommandManager.InvalidateRequerySuggestedが必要だと思います。RequerySuggestedイベントを強制的に発生させます。

于 2012-10-16T10:51:48.077 に答える
1

あなたのクラスは、イベントが宣言されているクラスから継承しているようです。イベントは、継承されたクラスではなく、基本クラスでのみ直接発生させることができます。

継承されたクラスでそれを上げたい場合は、ベースに次のメソッドを記述し、継承されたクラスから呼び出します。

protected void RaiseMyEvent()
{
if (MyEvent != null)
{
MuEvent(this, args)
}
}
于 2012-10-16T10:54:00.623 に答える