クラス間でイベントを渡すにはどうすればよいですか?C#イベントに沿ったバブリング/パススルー
私はそれがばかげていることを知っています(そしてそれです)が、私は過去の小さなことの間にこれを困惑しました。検索でも同様の質問が表示されなかったので、私はそれを提示すると考えました。ここで
が関与するオブジェクトです:
WinForm -> Speaker -> Tweeter
-> Woofer
[スピーカー、ツイーター、ウーファー]すべては、単純な文字列メッセージを送る「SpeakToMe」イベントを宣言します。イベントが標準パターンを使用して宣言される:
public delegate void SpeakToMeHandler(object sender, SpeakToMeEventArgs e);
public event SpeakToMeHandler SpeakToMe;
protected virtual void OnSpeakToMe(string message)
{
if (SpeakToMe != null) SpeakToMe(this, new SpeakToMeEventArgs(DateTime.Now.ToString() + " - " + message));
}
SpeakToMeEventArgsを文字列プロパティ(メッセージ)を含むのEventArgs &を継承する単純なクラスです。
これらのイベントはそれぞれ単独で機能します。たとえば、[Speaker、Tweeter、Woofer]のイベントを作成、登録、および起動するためのボタンをフォームに設定しました。それぞれが正しく戻ると報告します。
スピーカーが[Tweeter、Woofer]を作成し、そのイベントにサブスクライブするときに問題が発生します。
私は、[Tweeter、Woofer]が自分のイベントを発動し、スピーカーがそれを消費し、自分のイベントを発生させたいとします。私は、これは非常にまっすぐ進むべきであると思った:
void tweeter_SpeakToMe(object sender, SpeakToMeEventArgs e)
{
Console.Out.WriteLine("the tweeter is speaking: " + e.Message);
this.OnSpeakToMe("tweeter rockin' out [" + e.Message + "]");
}
(スピーカーで)この機能によってステッピング、ます。Console.Out.WriteLineは動作します。 OnSpeakToMeを続行すると、デリゲートがnullであることが示されます。
スピーカーのSpeakToMeイベントは、フォームによって購読されています。イベントの代理人がnullにならないようにする必要があることを理解しました。
これは簡単なものだと確信していますが、何が欠けていますか?
Btw、なぜ私がこれを探しているのか不思議です。 [スピーカー、ツイーター、ウーファー]は、本当に長いデータ処理操作のための私のデモスタンドインです。フォームはこれらを同時に実行し、各クラスから進捗状況を更新する必要があります。
いつものように、すべてのヘルプは非常に高く評価されています!
更新:すべてのフィードバックありがとうございます。私は本当に助けに感謝します!私はいくつかの良いアイデア(@David Basarab & @Brian)と物事を構成する方法に関するいくつかのアイデアを取り上げました。再度、非常に感謝!
を示唆しているあなたは、あなたのフォームがスピーカーのオブジェクトをサブスクライブする方法のコードスニペットを提供することはできますか? – LBushkin