0

イベントを定義するクラスがあります。

public class EventRaiserUtility
{
    public event EventHandler updateList;

    public void updateListEvent()
    {
        if (updateList != null)
        {
            updateList(this, EventArgs.Empty);
        }
    }
    public static EventRaiserUtility raiser = new EventRaiserUtility();
}

これが私のイベントを発生させる場所です:

EventRaiserUtility.raiser.updateListEvent();

そして最後に、これは私がリスナーを作成しようとしている場所です:

...
EventRaiserUtility.raiser.updateList += new EventHandler(raiser_updateList);
//placed in the init method of another class
...

private void raiser_updateList(object sender, EventArgs e)
{
    connType = MainWindowViewModel.getTTC();
}

簡単に言えば、このイベントは、リストが更新されたときに通知し、別のリストを更新する必要がgetTTC()ありraiser_updateListます。

しかし、raiser_updateList呼び出されることはありません。なんで?私のコードの 3 つのスニペットはすべて 3 つの異なるクラス (同じプロジェクト) にありますが、これは問題ではありません。

4

3 に答える 3

5

EventRaiserUtility呼び出す直前にnew を作成していますupdateListEvent(ちなみに、これには .NET 規則に従うための大文字が必要ですU; 同上updateList=> UpdateList) - しかし、イベントをサブスクライブするために別のものを作成しています。 EventRaiserUtilityそれらは異なるオブジェクトであるため、異なるイベント サブスクライバーがあります。イベントを発生させる前に常に新しいオブジェクトを作成すると、サブスクライバーが存在することはありません。

含まれているクラスのインスタンス変数に単一 EventRaiserUtilityのものを格納する必要があります-構築時にそれを作成し、ある場所でイベントにサブスクライブして別の場所で発生させます...しかし、それらは同じEventRaiserUtilityオブジェクトについて話しているためです、サブスクリプションを失うことはありません。

(正直に言うと、このユーティリティ クラスが実際に多くの価値を持っているかどうかは明らかではありません。クラスでイベントを直接宣言しないのはなぜですか? また、EventHandlerまったく同じシグネチャを持っているのに、なぜ独自のデリゲートを宣言するのですか?)

于 2014-10-10T09:19:47.100 に答える
0

イベントを実際に所有するには、1 つのオブジェクトが必要です。おそらくそれは EventRaiserUtility ですが、両方のクラスで同じインスタンスを使用できるようにする必要があります。それらのクラス間の関係を知らずに

于 2014-10-10T09:45:10.850 に答える