Button ClickHandler erstellen

  • WPF

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Button ClickHandler erstellen

    Hi

    ich bräuchte mal wieder etwas Starthilfe.
    Also ich möchte aus den untersten Controls auf Clicks reagieren können.
    in meinem Bsp die ucPerson.xaml
    Baue also nen Button ein. Dazu das MouseUp Event:

    VB.NET-Quellcode

    1. <Grid Margin="4" >
    2. <Grid.RowDefinitions >
    3. <RowDefinition Height="1*" />
    4. <RowDefinition Height="1*" />
    5. <RowDefinition Height="1*" />
    6. <RowDefinition Height="1*" />
    7. </Grid.RowDefinitions>
    8. <Label x:Name="lblRefnr" Content="{Binding Path=RefNr}" Grid.Row="0" Background="#FFD16464" />
    9. <Label x:Name="lblVorname" Content="{Binding Path=VorName}" Grid.Row="1" Background="#FFA7B9E0" />
    10. <Label x:Name="lblGebname" Content="{Binding Path=GeburtsName}" Grid.Row="2" Background="#FF6CC784" />
    11. <Button Content="ok" Grid.Row="3" Margin="1" MouseUp="Button_MouseUp"/>
    12. </Grid>

    Was wahrscheinlich schon der falsche weg ist weil wohin Raisen ausm CodeBehind.
    Den ich möchte ja eigentlich in der dazugehörigen Klasse clPerson bzw dessen Instanz rauskommen.
    "Früher" habe ich das alles durch Adresshandler beim erzeugen der Item Collections kreuz und quer zugewiesen. :D
    Das geht ja hier nicht da die ItemCollections in den Controlls ja von WPF selbst gebaut wurden.

    Ich habe was über routed Events gefunden....hm ja jetzt hörts auf

    *Thema ausgelagert - hatte mit deinem letzen Problem nichts mehr zu tun, bitte in so einem Fall ein neues Thema erstellen* ~NoFear23m

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Hallo @Prive

    Naja, das kommt jetzt darauf an. Arbeitest du mit Binding (laut dem XAML schon) ?
    Wenn dem so ist solltest du an einen Command binden da dir dieser viele weitere Möglichkeiten eröffnet welche du mit einen Handler nicht hast/hättest.
    Hierfür verwenden die meissten eine RelayCommand-Klasse da diese so einiges vereinfacht.

    Hier eine implementierung und ein Beispiel für die erstellung eines Command:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Windows.Input
    2. ''' <summary>
    3. ''' Diese Klasse Implementiert das ICommand Interface, so muss man nicht in jeder Klasse eines ViewModel alles selbst implementieren.
    4. ''' Einfach eine Command wie folgt Instanzieren:
    5. ''' MyCommand = New RelayCommand(AddressOf MyCommand_Execute, AddressOf MyCommand_CanExecute)
    6. ''' </summary>
    7. Public Class RelayCommand : Implements ICommand
    8. #Region " Fields "
    9. ReadOnly _execute As Action(Of Object)
    10. ReadOnly _canExecute As Predicate(Of Object)
    11. #End Region
    12. #Region " Constructors"
    13. ''' <summary>
    14. ''' Erstellt einen neuen Command welcher NUR Executed werden kann.
    15. ''' </summary>
    16. ''' <param name="execute">The execution logic.</param>
    17. ''' <remarks></remarks>
    18. Public Sub New(execute As Action(Of Object))
    19. Me.New(execute, Nothing)
    20. End Sub
    21. ''' <summary>
    22. ''' Erstellt einen neuen Command welcher sowohl die Execute als auch die CanExecute Logik beinhaltet.
    23. ''' </summary>
    24. ''' <param name="execute">Die Logik für Execute.</param>
    25. ''' <param name="canExecute">Die Logik für CanExecute.</param>
    26. ''' <remarks></remarks>
    27. Public Sub New(execute As Action(Of Object), canExecute As Predicate(Of Object))
    28. If execute Is Nothing Then
    29. Throw New ArgumentNullException("execute")
    30. End If
    31. _execute = execute
    32. _canExecute = canExecute
    33. End Sub
    34. #End Region
    35. #Region " ICommand Members "
    36. ''' <summary>
    37. ''' Setzt die CanExecute-Methode des ICommand-Interfaces auf True oder False
    38. ''' </summary>
    39. ''' <param name="parameter"></param>
    40. ''' <returns>Gibt zurück ob die Aktion ausgeführt werden kann oder nicht</returns>
    41. ''' <remarks>
    42. ''' Benutzt DebuggerStepThrough from System.Diagnostics
    43. ''' Der Debugger überspringt diese Prozedur also, es sei den es wird explizit ein Haltepunkt gesetzt.
    44. ''' </remarks>
    45. <DebuggerStepThrough>
    46. Public Function CanExecute(parameter As Object) As Boolean Implements ICommand.CanExecute
    47. Return _canExecute Is Nothing OrElse _canExecute(parameter)
    48. End Function
    49. ''' <summary>
    50. ''' Event welches geworfen wird wenn die Propertie CanExecuteChanged sich ändert.
    51. ''' </summary>
    52. ''' <remarks></remarks>
    53. Public Custom Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged
    54. AddHandler(value As EventHandler)
    55. If _canExecute IsNot Nothing Then
    56. AddHandler CommandManager.RequerySuggested, value
    57. End If
    58. End AddHandler
    59. RemoveHandler(value As EventHandler)
    60. If _canExecute IsNot Nothing Then
    61. RemoveHandler CommandManager.RequerySuggested, value
    62. End If
    63. End RemoveHandler
    64. RaiseEvent(sender As Object, e As EventArgs)
    65. End RaiseEvent
    66. End Event
    67. ''' <summary>
    68. ''' Führt die Prozedur Execute des ICommand.Execute aus
    69. ''' </summary>
    70. ''' <param name="parameter"></param>
    71. ''' <remarks></remarks>
    72. Public Sub Execute(parameter As Object) Implements ICommand.Execute
    73. _execute(parameter)
    74. End Sub
    75. #End Region
    76. End Class


    VB.NET-Quellcode

    1. Private _testCommand As ICommand
    2. Public ReadOnly Property TestCommand As ICommand
    3. Get
    4. If _testCommand Is Nothing Then _
    5. _testCommand = New RelayCommand(AddressOf DieMethodeFuerExecute, AddressOf DieMethodeFuerCanExecute)
    6. Return _testCommand
    7. End Get
    8. End Property
    9. Private Sub DieMethodeFuerExecute(obj As Object)
    10. 'Mach was beim Click
    11. End Sub
    12. Private Function DieMethodeFuerCanExecute(obj As Object) As Boolean
    13. 'Prüfen ob man klicken darf - Button wir dann Disabled oder Enabled
    14. Return True 'Hier das Ergebniss zurückgeben
    15. End Function



    Wenn du Fragen hast frag ruig.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Prive schrieb:

    Interface Teufelzzeug.

    Haha ;)

    Wenn du ernsthaft mit der WPF und später vieleicht mit MVVM Arbeiten möchtest solltest du dich früher oder später mit Vererbung und Interfaces beschäftigen. Das erleichtert dir enorm das Leben und bewirkt gleichzeitig das du so einiges was du bisher "angewandt" hast viel besser verstehst.

    Die RelayCommand-Klasse implementiert das interface ICommand (übrigend genauso wie die Klassen RoutedCommand und RoutedUICommand aus der WPF) und muss sohin die Methoden Execute und CanExecute und das Event CanExecuteChanged implementieren. Da die Klasse dieses Interface implementiert kann die RelayCommand-Klasse einem Property von Typ ICommand als Wert zugewiesen werden. So wie jede andere Instanz einer Klasse welche das Interface ICommand implementieren würde.

    Gut. Was macht nun die RelayCommand Klasse? Und wozu?
    Nun, normalerweise müsste man für jeden Command eine eigene Klasse erstellen welche ICommand implementiert und dort den Handler für CanExecute und Execute angeben.
    Unsere RelayCommand-Klasse erledigt uns dies mit nur einer Zeile, da sie im Konstruktor einen Delegaten (bzw. zwei) entgegen nehmen kann. So sparen wir uns sehr viel Tipparbeit.

    Vieleicht noch zum vergleich wie man sonst einen eigenen Command erstellen müsste:
    stackoverflow.com/questions/32…mplement-a-custom-command

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##