Laden...

WPF Parameter an Eventhandler übergeben?

Erstellt von PoWl vor 11 Jahren Letzter Beitrag vor 11 Jahren 7.258 Views
P
PoWl Themenstarter:in
219 Beiträge seit 2008
vor 11 Jahren
WPF Parameter an Eventhandler übergeben?

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

6.862 Beiträge seit 2003
vor 11 Jahren

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.

C
2.122 Beiträge seit 2010
vor 11 Jahren

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.

F
18 Beiträge seit 2012
vor 11 Jahren

Das müsste so gehen: if (sender.Equals(buttonxy))

F
183 Beiträge seit 2009
vor 11 Jahren

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.

C
2.122 Beiträge seit 2010
vor 11 Jahren

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.