2017-08-04 12 views
0

デリゲートイベントを使用して再利用して複数のクリックイベントを発生させる必要がないかどうかを確認しようとしています。今、私は次のことを持っている...Cでデリゲートイベントを再利用する適切な方法#

namespace EventsWPF 
{ 

public partial class MainWindow : Window 
{ 
    public delegate void MyEvent(object sender, RoutedEventArgs e); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     btn1.Click += MyEvent; 
     btn2.Click += MyEvent; 
    } 


} 

}

が、これはそれを行うための正しい方法ですか?それとも私は間違った方法を考えていますか?私はラムダ式をイベントハンドラとして使用できることを知っています。しかし、複数のイベントがある場合、デリゲートを再利用するだけで、各ハンドラに複数のLamda式を作成する必要はありません。

+2

はそれがコンパイルん:ここで

を使用すると、ラムダ式を再利用する方法ですか?もしあなたがどんなエラーを取得していないのですか? – juharr

答えて

1

はい、2つのボタンのロジックが同じである必要があります。同じハンドラを添付すると、は完全に細かいです。あなたはdelegateタイプをつけてそれをすることはできません。実際のメソッドが必要になります(@hoodaticusで説明されているように)。

これはWPFである場合:

は通常しかし、2つのボタンが同じことをしないと、あなたはこれで逃げることはできません。もっと一般的には、2つのボタンは同じことをしますが、異なる引数を使用します。残念ながら、WinFormsスタイルのアプローチはここでは非常に苦しいでしょう(あなたはsenderと確認できますが、ewww)。

この場合(実際にはすべての場合)、MVVMパターンを活用し、ボタンのコマンドを設定したい(クリックハンドラではない)。次に、CommandParameterを使用してカスタムデータをハンドラに取り込むことができます。

+0

私はこの回答にすべて同意します。このコンテキストでラムダを再利用する場合は、ICommandラッパーを使用してラムダを実行する必要があります。しかし、私はこの質問が実際にはWPFに関するものかどうかはわかりませんが、WPFは単なる例であるようです。 – hoodaticus

+0

@hoodaticus十分に公正。しかし、私の最初の段落はWPF固有のコンテキストから離れていますが、 – BradleyDotNET

+0

これは意味があります。しかし、ラムダ関数の代理人ではありませんか?私はこれについて考えていた方法は、ラムダ関数はメソッドである代理人だということです。技術的には、デリゲートはメソッドなので、イベントとして使うことができるはずです。これはこれについての考え方が間違っていますか? – PandaLuna

1

MyEventあなた自身のイベントを作成していないので、ここでは不要です。他のメンバーに登録するだけです。 delegateキーワードは、メソッドのシグネチャと戻り値の型を宣言します。インスタンスを作成したりメソッド本体を定義したりすることはありません。

Action<object, RoutedEventArgs> myHandler = (o, e) => 
{ 
    /* write event handler code here, you must */ 
}; 

btn1.Click += myHandler; 
btn2.Click += myHandler; 
関連する問題