Aber wie Updated denn das CanExecuteChanged event (was ja mit RaiseExecuteChanged() aufgerufen wird) das CanExecute? Also eigentlich Subskriped doch gar keiner zum event? ..oder läuft das alles unter der Haube über das Binding des Commands
Mvvm hat immer das Ziel dass die Logik (Viemodel) unabhängig von der konkreten Benutzeroberfläche ist. Das binding übernimmt dann die Aktualisierung der Benutzeroberfläche sowie das delegieren der konkreten Aufgabe an die Logik.
Das funktioniert sehr sauber bei Buttons, aber was mache ich, wenn ich auf einem anderen Oberflächenelement, z.B. einer Textbox, ein Event, z.B. GotFocus, an eine Methode in meinem ViewModel binden möchte? Super klasse Videos übrigens! Helfen mir sehr in WPF weiter voranzukommen.
Hi ich schon wieder :D reine Verständnisfrage. Kann man generell sagen, solange ich den Wert einer Propertie nur lesen will (innerhalb des View-Models) dann greife ich auf _lastName zu. Wäre ja hier im Beispiel egal, ich könnte den Wer ja auch von LastName abrufen. Oder ist das "unschön", da ja etwas im Get; mit stehen könnte was dann aufgerufen wird?
Naja, der normale nutzer von C# weis denke ich nicht direkt was ein Predicate Objekt ist.... Das hat denke ich ein wenig gefehlt, aber im Endeffekt kann man auch nachlesen... Deine Videos sind gut :)
Zu den standard Delegates Predicate, Action und Func gibt's ein Video das ist glaub ich auch in der Infobox verlinkt werde ich sonst noch machen. Danke fürs Feedback
Ok. Soweit machts dann jetzt langsam Sinn. Aber wie funktioniert die Abfrage während des Tippens in das Textfeld (so wird das RaiseCanExecuteChanged() ja nur gefeuert, wenn man das Textfeld verlässt). Hat sich erledigt: Es funktioniert doch mit dem UpdateSourceTrigger im Text der TextBox (hat zuerst aus irgendeinem Grund nicht funktioniert)
kann man das CanExecute irgendwie so beschreiben das wenn der Button aktiv ist oder die Methode verarbeitet der Button oder alles Buttons ausgrauen, also quasi if canExecute do work => false?
Also du meinst während des executes. Ja du machst eine variable die du im CanExecute zusätzlich abfragst (Is working) und im Execute setzt du diese auf true bzw false und rufst zugleich das raiseCanExecuteChanged vom Button aus nachdem du es gesetzt hast oder noch einfacher: eine Eigenschaft Is working welche das erledigt
Würde mich freuen, wenn du in diesem Video vielleicht in einem Extravideo das noch einmal irgend wie vertiefst. Also speziell zur Klasse DelegateCommand und alles was darin steht...
In die Klasse selbst gehört nicht mehr rein als was hier gezeigt wurde. Falls du die Delegates zum Vertiefen meinst dazu gibts hier schon einiges. Sollte dir was fehlen lass es mich bitte wissen: th-cam.com/users/results?search_query=42+entwickler+delegate
Danke für das Tutorial! Mir stellt sich nur gerade die Frage ob es möglich wäre (o) = > in einer Methode zu setzten und diese dann in "new DelegateCommand(Methode)" auf zurufen ? ClearCommand = new DelegateCommand( > (o) => !String.IsNullOrEmpty(firstname) || !String.IsNullOrEmpty(lastname), > (o) => { FirstName = ""; LastName = ""; } ); zu ClearCommand = new DelegateCommand(Methode) Habe es versucht aber das "ClearCommand.RaiseCanExecuteChanged();" wird nicht ausgelöst. Über einen Lösungsansatz wäre ich dir sehr Dankbar!
Das raiseCanExecuteChanged braucht in dem Fall dann den Namen der Eigenschaft übergeben die neu ausgewertet werden soll. Aufgrund des callermemberName-Attributs würde der Methodenname statt des Property-Namen verwendet werden.
Hi, bin großer Fan von deinen Videos. Danke für das Uploaden :). ICommand ist mittlerweile CanExecute(object? parameter) und Execute(object? parameter)... Könntest du ein Update von Source machen?
Hallo zusammen, nachdem ich die Zeile "public DelegateCommand(Action execute) : this(null, execute) { }" übertragen habe, sagt mir Visual Studio "Ein NULL-Literal kann nicht in einen Non-Nullable-Verweistyp konvertiert werden. Wäre jemand so hilfreich und könnte mir bei der Fehlersuche behilflich sein? Vielen Dank!
Mach mal aus Predicate ein Predicate? Weil du im zweiten Konstruktor den ersten aufrufst und null übergibst. Daher sollte es auch nullable sein. (Und auch bei der variable das ? dazu
Hab's dir zurück geschickt (findest in den Downloads) war es das? Ansonsten bitte um das ganze Projekt damit ich den Fehler direkt sehen / nachstellen kann
@@42Entwickler , größtenteils ja. Bei "public bool CanExecute..." und "public void Execute(....:" sagt er mir "Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand Warnung CS8767 Die NULL-Zulässigkeit von Verweistypen im Typ des Parameters "parameter" von "bool DelegateCommand.CanExecute(object parameter)" entspricht (möglicherweise aufgrund von Attributen für die NULL-Zulässigkeit) nicht dem implizit implementierten Member "bool ICommand.CanExecute(object? parameter)". D:\Programmierungen\Visual Studio\.... 23 Aktiv" und "Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand Warnung CS8767 Die NULL-Zulässigkeit von Verweistypen im Typ des Parameters "parameter" von "void DelegateCommand.Execute(object parameter)" entspricht (möglicherweise aufgrund von Attributen für die NULL-Zulässigkeit) nicht dem implizit implementierten Member "void ICommand.Execute(object? parameter)". D:\Programmierungen\Visual Studio\....\DelegateCommand.cs 25 Aktiv " In deiner Datei läuft es....seltsam
Ist das nicht echt übertrieben umständlich und macht eigentlich die Vorteile von MVVM zunichte ? Ich meine im Vergleich zu einem einfachen EventHandler ist das schon echt viel Aufwand.
Nein die Command Geschichte ist noch der geringste Overhead ;-) da gibt es schlimmere. Button enabled/disabled wir damit Recht sauber. Man bleibt testbar und unabhängig von der UI etc.
@@42Entwickler Hm. Ok. Vielleicht seh ich das auch nur aus der Perspektive von kleineren Projekten. Bei grösserem kann ich mir schon vorstellen, dass es so viel einfacher und übersichtlicher ist
Bei kleinen "Tools" kann man durchaus auf mvvm verzichten oder wenn es keine speziellen UI Anforderungen gibt ganz auf Windows Forms setzen. Weil man dann schneller ans Ziel kommen kann. Bei größeren Themen oder wenn Testbarkeit etc. Wichtig ist kommt man an mvvm eher schwer vorbei
Sorry, aber soviel Zirkus um diese einfache Funktionalität? Und das soll jetzt besonders gut lesbar sein? Also ein Fan von diesem MVVM bin ich schon mal nicht!
Vielen Dank erst einmal für diese fantastische Videoreihe. Sie hat mir wirklich sehr geholfen, um MVVM anzuwenden. Mir ist bewusst, dass in diesem Video DelegateCommands das Thema ist und dieses hast du für mich sehr verständlich beschrieben. Bei meiner Literaturrecherche (Quelle siehe unten) bin ich auf eine weitere Methode gestoßen, wie man Button-Events auslösen kann und ich würde sehr gern deine Meinung dazu erfahren. Hierbei kann man aus der View (XAML) direkt Methoden aus dem ViewModel aufrufen. Ein Beispiel würde so aussehen:
Quelle (Buch): Weil, Arnaud. Learn WPF MVVM - XAML, C# and the MVVM pattern: Be ready for coding away next week using WPF and MVVM
Bitte gerne und danke für das Lob. Funktioniert auch. Ist vielleicht Gewohnheit aber gerade wenn's dann um Parameter geht und ob der Button Aktiv oder Inaktiv sein soll finde ich persönlich das Command Pattern simpler ;-) ist aber nur meine Meinung
Nach meinem Verständnis sorgt die Interaction-Library dafür, dass du die Commands auch noch an andere Events binden kannst. Beispielsweise kannst du mit dem Interaction-Trigger ebenfalls an MouseHover, LostFocus, etc. binden. Mit dem üblichen Command-Binding, wie in dem Video hier gezeigt, wird immer an das Standard-Event (beim Button der Click) gebunden.
super Tutorialreihe, kurz und sehr informativ, einfach spitze, danke!!
Dankeschön. Viel Spaß damit und weitersagen nicht vergessen :-)
richtig gute Videos🙏
Dankeschön
danke, nun verstehe ich langsam MVVM
Prima!
Für mich verständlich erklärt also top
Danke
Danke
Sehr gutes Tutorial!
Danke
Aber wie Updated denn das CanExecuteChanged event (was ja mit RaiseExecuteChanged() aufgerufen wird) das CanExecute? Also eigentlich Subskriped doch gar keiner zum event? ..oder läuft das alles unter der Haube über das Binding des Commands
Unter der Haube wird sich auf das Ereignis CanExecuteChanged regiert. Sobald dieses Auftritt wird CanExecute erneut aufgerufen.
@@42Entwickler OK super danke.. einfach nach paar min. Ne Antwort auf ein 3 Jahre altes Video, sehr geil
@Gardyy_1 :-) gelingt mir leider nicht immer
schöne Videoreihe
Dankeschön. Wird Zeit sie zu erweitern ;-)
Also welchen Vorteil hat das Binding eines Buttons gegenüber eines "normalen ClickEvents" ?
Mvvm hat immer das Ziel dass die Logik (Viemodel) unabhängig von der konkreten Benutzeroberfläche ist. Das binding übernimmt dann die Aktualisierung der Benutzeroberfläche sowie das delegieren der konkreten Aufgabe an die Logik.
Kann man die Klasse DelegateCommand auch unter dem ViewModel zuordnen oder gehört das schon eher dem Model?
Ja mehr zum Viewmodel. Ist ein Bindeglied wenn man so will zwischen View und Viewmodel
danke! danke!
Bitte
Das funktioniert sehr sauber bei Buttons, aber was mache ich, wenn ich auf einem anderen Oberflächenelement, z.B. einer Textbox, ein Event, z.B. GotFocus, an eine Methode in meinem ViewModel binden möchte? Super klasse Videos übrigens! Helfen mir sehr in WPF weiter voranzukommen.
da gibt's die trigger die dann auf die commands gebunden werden; da sollte ich wohl ein video dazu machen ;-) Danke fur die frage
>> Hier für dich, so gehts: th-cam.com/video/n-b2BJ3TlHI/w-d-xo.html
Hi ich schon wieder :D
reine Verständnisfrage. Kann man generell sagen, solange ich den Wert einer Propertie nur lesen will (innerhalb des View-Models) dann greife ich auf _lastName zu. Wäre ja hier im Beispiel egal, ich könnte den Wer ja auch von LastName abrufen. Oder ist das "unschön", da ja etwas im Get; mit stehen könnte was dann aufgerufen wird?
Lesen und Schreiben immer über properties nie direkt variablen die sollen private sein um den Zugriff regeln zu können
Naja, der normale nutzer von C# weis denke ich nicht direkt was ein Predicate Objekt ist.... Das hat denke ich ein wenig gefehlt, aber im Endeffekt kann man auch nachlesen... Deine Videos sind gut :)
Zu den standard Delegates Predicate, Action und Func gibt's ein Video das ist glaub ich auch in der Infobox verlinkt werde ich sonst noch machen. Danke fürs Feedback
@@42Entwickler
Gerne, hab nur deine beschreibung noch nicht gelesen... Mich hatte direkt nur MVVM angesprochen und deine Aussage im Video :D
@@thereaperhimself5268 th-cam.com/video/0z1qwdkNWwI/w-d-xo.html
wenn ich es weis, darf ich dann stolz sein :P
@@somedotnetguy8059 ne
Ok. Soweit machts dann jetzt langsam Sinn. Aber wie funktioniert die Abfrage während des Tippens in das Textfeld (so wird das RaiseCanExecuteChanged() ja nur gefeuert, wenn man das Textfeld verlässt).
Hat sich erledigt: Es funktioniert doch mit dem UpdateSourceTrigger im Text der TextBox (hat zuerst aus irgendeinem Grund nicht funktioniert)
:)
kann man das CanExecute irgendwie so beschreiben das wenn der Button aktiv ist oder die Methode verarbeitet der Button oder alles Buttons ausgrauen, also quasi if canExecute do work => false?
Also du meinst während des executes. Ja du machst eine variable die du im CanExecute zusätzlich abfragst (Is working) und im Execute setzt du diese auf true bzw false und rufst zugleich das raiseCanExecuteChanged vom Button aus nachdem du es gesetzt hast oder noch einfacher: eine Eigenschaft Is working welche das erledigt
Würde mich freuen, wenn du in diesem Video vielleicht in einem Extravideo das noch einmal irgend wie vertiefst. Also speziell zur Klasse DelegateCommand und alles was darin steht...
In die Klasse selbst gehört nicht mehr rein als was hier gezeigt wurde. Falls du die Delegates zum Vertiefen meinst dazu gibts hier schon einiges. Sollte dir was fehlen lass es mich bitte wissen: th-cam.com/users/results?search_query=42+entwickler+delegate
Danke für das Tutorial! Mir stellt sich nur gerade die Frage ob es möglich wäre (o) = > in einer Methode zu setzten und diese dann in "new DelegateCommand(Methode)" auf zurufen ?
ClearCommand = new DelegateCommand(
> (o) => !String.IsNullOrEmpty(firstname) || !String.IsNullOrEmpty(lastname),
> (o) => { FirstName = ""; LastName = ""; }
);
zu ClearCommand = new DelegateCommand(Methode)
Habe es versucht aber das "ClearCommand.RaiseCanExecuteChanged();" wird nicht ausgelöst.
Über einen Lösungsansatz wäre ich dir sehr Dankbar!
Das raiseCanExecuteChanged braucht in dem Fall dann den Namen der Eigenschaft übergeben die neu ausgewertet werden soll. Aufgrund des callermemberName-Attributs würde der Methodenname statt des Property-Namen verwendet werden.
@@42Entwickler Danke für die Antwort :) Und bitte mach weiter mit diesen Top Videos!
@@benjaminlaunicke1256 bitte und gerne und dankeschön
Hi, bin großer Fan von deinen Videos. Danke für das Uploaden :). ICommand ist mittlerweile CanExecute(object? parameter) und Execute(object? parameter)... Könntest du ein Update von Source machen?
Hey. Danke danke. Was bzw wo meinst du soll ich den source updaten?
Hallo zusammen, nachdem ich die Zeile "public DelegateCommand(Action execute) : this(null, execute) { }" übertragen habe, sagt mir Visual Studio "Ein NULL-Literal kann nicht in einen Non-Nullable-Verweistyp konvertiert werden. Wäre jemand so hilfreich und könnte mir bei der Fehlersuche behilflich sein? Vielen Dank!
Ich bin gut eine halbe Stunde jetzt online du kannst mir deinen source hier schicken dann schau ich ihn mir an: www.wavenet8.com?id=w8
@@42Entwickler, vielen lieben Dank!
Mach mal aus Predicate ein Predicate? Weil du im zweiten Konstruktor den ersten aufrufst und null übergibst. Daher sollte es auch nullable sein. (Und auch bei der variable das ? dazu
Hab's dir zurück geschickt (findest in den Downloads) war es das? Ansonsten bitte um das ganze Projekt damit ich den Fehler direkt sehen / nachstellen kann
@@42Entwickler , größtenteils ja. Bei "public bool CanExecute..." und "public void Execute(....:" sagt er mir "Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Warnung CS8767 Die NULL-Zulässigkeit von Verweistypen im Typ des Parameters "parameter" von "bool DelegateCommand.CanExecute(object parameter)" entspricht (möglicherweise aufgrund von Attributen für die NULL-Zulässigkeit) nicht dem implizit implementierten Member "bool ICommand.CanExecute(object? parameter)". D:\Programmierungen\Visual Studio\.... 23 Aktiv" und "Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Warnung CS8767 Die NULL-Zulässigkeit von Verweistypen im Typ des Parameters "parameter" von "void DelegateCommand.Execute(object parameter)" entspricht (möglicherweise aufgrund von Attributen für die NULL-Zulässigkeit) nicht dem implizit implementierten Member "void ICommand.Execute(object? parameter)". D:\Programmierungen\Visual Studio\....\DelegateCommand.cs 25 Aktiv
"
In deiner Datei läuft es....seltsam
Ist das nicht echt übertrieben umständlich und macht eigentlich die Vorteile von MVVM zunichte ?
Ich meine im Vergleich zu einem einfachen EventHandler ist das schon echt viel Aufwand.
Nein die Command Geschichte ist noch der geringste Overhead ;-) da gibt es schlimmere. Button enabled/disabled wir damit Recht sauber. Man bleibt testbar und unabhängig von der UI etc.
@@42Entwickler Hm. Ok. Vielleicht seh ich das auch nur aus der Perspektive von kleineren Projekten. Bei grösserem kann ich mir schon vorstellen, dass es so viel einfacher und übersichtlicher ist
Bei kleinen "Tools" kann man durchaus auf mvvm verzichten oder wenn es keine speziellen UI Anforderungen gibt ganz auf Windows Forms setzen. Weil man dann schneller ans Ziel kommen kann. Bei größeren Themen oder wenn Testbarkeit etc. Wichtig ist kommt man an mvvm eher schwer vorbei
🖥️
;)
Sorry, aber soviel Zirkus um diese einfache Funktionalität? Und das soll jetzt besonders gut lesbar sein? Also ein Fan von diesem MVVM bin ich schon mal nicht!
;) verstehe. zuerst scheint der Aufwand exorbitant. Doch der Großteil von UI Aktualisierungen fällt mit der Zeit weg. Was ziemlich prima ist.
@@42Entwickler Hoffentlich! ;)
Ein Hauptthema ist die testbarkeit (mit unit Tests) dir ansonsten kaum hinzubekommen ist
Vielen Dank erst einmal für diese fantastische Videoreihe. Sie hat mir wirklich sehr geholfen, um MVVM anzuwenden.
Mir ist bewusst, dass in diesem Video DelegateCommands das Thema ist und dieses hast du für mich sehr verständlich beschrieben.
Bei meiner Literaturrecherche (Quelle siehe unten) bin ich auf eine weitere Methode gestoßen, wie man Button-Events auslösen kann und ich würde sehr gern deine Meinung dazu erfahren.
Hierbei kann man aus der View (XAML) direkt Methoden aus dem ViewModel aufrufen. Ein Beispiel würde so aussehen:
Quelle (Buch): Weil, Arnaud. Learn WPF MVVM - XAML, C# and the MVVM pattern: Be ready for coding away next week using WPF and MVVM
Bitte gerne und danke für das Lob. Funktioniert auch. Ist vielleicht Gewohnheit aber gerade wenn's dann um Parameter geht und ob der Button Aktiv oder Inaktiv sein soll finde ich persönlich das Command Pattern simpler ;-) ist aber nur meine Meinung
Nach meinem Verständnis sorgt die Interaction-Library dafür, dass du die Commands auch noch an andere Events binden kannst. Beispielsweise kannst du mit dem Interaction-Trigger ebenfalls an MouseHover, LostFocus, etc. binden. Mit dem üblichen Command-Binding, wie in dem Video hier gezeigt, wird immer an das Standard-Event (beim Button der Click) gebunden.