Hi,
ist es in der WPF irgendwie möglich an einen Eventhandler auch Parameter zu übergeben?
Ich habe mehrere Buttons und würde gerne für alle einen gemeinsamen Eventhandler verwenden, welcher dann nur noch einen Parameter erwartet um zu wissen, wie er sich verhalten soll. Im XAML-Code würde ich diesen Parameter dann fest einspeichern.
<Button Click="Eventhandler(2)" /> So z.B., wobei die 2 den Parameter darstellt.
Gibts da was?
lg PoWl
Jein,
MAn kann so keine Parameter mitgeben, weil man ja nichts mit dem Aufruf dex Eventhandlers zu tun hat, sondern der Button ruft einfach die angegebene Methode auf, und der Button setzt EventArgs etc. Aber, der sender ist ja dein Button, und anhand dessen kannst du ja entscheiden welcher Button es war und wies dann weitergehen soll.
Ich persönlich würde aber unterschiedliche Eventhandler benutzen und im eigentlichen Eventhandler dann immer nur ne gemeinsame Methode aufrufen mit dem entsprechenden Parameter. So vermeidet man ewiglange if/else - switch Blöcke bei vielen unterschiedlichen Eventauslösern.
Baka wa shinanakya naoranai.
Mein XING Profil.
In Forms wird da der "sender" übergeben, mit if (sender == buttonxy) kann man dann rausfinden welcher Button geklickt wurde. In WPF gibts sicher auch was ähnliches.
Hallo Powl,
Du kannst keinen Parameter mitgeben, dafür müsstest Du ein Command (z.B. ein DelegateCommand) verwenden, siehe hierzu MVVM.
Allerdings(auch wenn ich Tallas Lösung aus Entwurfssicht viel besser finde) kannst Du z.B. jeden Button einen Namen geben und den Namen des Buttons abfragen.
<StackPanel Orientation="Horizontal">
<Button Name="Button1" Content="Button1" Click="Button_Click"/>
<Button Name="Button2" Content="Button2" Click="Button_Click"/>
<Button Name="Button3" Content="Button3" Click="Button_Click"/>
<Button Name="Button4" Content="Button4" Click="Button_Click"/>
</StackPanel>
private void Button_Click(object sender, RoutedEventArgs e)
{
var button = sender as Button;
if (button != null)
{
if (button.Name.Equals("Button1"))
Console.WriteLine("Button1");
if (button.Name.Equals("Button2"))
Console.WriteLine("Button2");
if (button.Name.Equals("Button3"))
Console.WriteLine("Button3");
if (button.Name.Equals("Button4"))
Console.WriteLine("Button4");
}
}
Wenn Du gegen eine Liste bindest (Stichwort Databinding) kannst Du Dir das aktuell ausgewählte Item speichern und dieses Abfragen (dann brauchst Du keine Namen vergeben).
Kann ich aber nicht beurteilen, weil ich nicht weiß was Du da machst.
Prinzipiell würde ich (wie oben geschrieben) Tallas Lösung vorziehen. Es macht in der Regel mehr Sinn, individuelle Eventhandler anzubieten, die dann eine gemeinsame Methode aufrufen. So brauchst Du nicht abfragen, welcher Button geklickt wurde.
Aber wie gesagt: Letztendlich sind wir zu weit weg, um das zu bewerten.
Beim Abfragen würde ich nicht auf den Namen als String, sondern auf die Variable an sich zugreifen.
Beim Vergleich button.Name = "Button1" passiert einfach ungewollt nichts mehr, wenn der Name des Buttons geändert wird.
Bei button == Button1 gibts einen Compilerfehler, der einen darauf aufmerksam macht dass es keinen Button1 mehr gibt.
Ob einzelne Eventhandler oder einen einzigen, würde ich von der Situation abhängig machen.