Relaycommand Syntax vb.net zu c#

  • C#

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Joshi.

    Relaycommand Syntax vb.net zu c#

    Hallo Leute,

    ich bin gerade dabei ein Projekt von VB.net auf C# umzustellen, im großen und ganzen klappt das ganz gut aber bei einem Syntax habe ich ein Problem.
    Es geht um das Relaycommand einer WPF Applikation in VB.net habe ich bis dato geschrieben:

    VB.NET-Quellcode

    1. Public Property CmdProtocol As New RelayCommand(Sub() ProtocolExecute(), Function() ProtocolCanExecute())

    ProtocolExecute ist eine Sub ohne Parameter
    ProtocolCanExecute ist eine Function vom Typ Boolean auch ohne Parameter.

    Der Code Converter gibt mir folgendes:

    C#-Quellcode

    1. public RelayCommand CmdProtocol { get; set; } = new RelayCommand(() => ProtocolExecute(), () => ProtocolCanExecute());

    diese Syntax führt zur Fehlermeldung CS0236 "A field initializer cannot reference the non-static field, method, or property ProtocolExecute.

    Wenn ich es wie folgt schreibe:

    C#-Quellcode

    1. public RelayCommand CmdProtocol2 => new RelayCommand(p => ProtocolExecute(), p => ProtocolCanExecute());

    funktioniert es ohne Fehlermeldung aber aus meiner Sicht ist es jetzt eine Variable und keine Property mehr die ich über WPF Binding ansprechen kann.

    (Ich kann es leider aktuell nicht testen weil ich noch 10799 Errors im Projekt habe :/ ) ist der 2. Syntax korrekt oder gib ich auf dem Holzweg?

    Danke
    mfG.
    Stephan
    @kaifreeman Zieh Dir mal das laufende Programm im IlSpy in der anderen Sprache an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    die vb-KurzProperty kannste so nicht übersetzen.
    für c# brauchste dafür eine Property mit Backing-Field, und das BackingField muss in geeigneter Weise initialisiert werden.
    so wie du's hast ists zwar auch ein Property, aber der Code würde bei jedem Aufruf ein neue INstanz erstellen (so ist das nunmal mit dem Schlüsselwort new)
    @RodFromGermany
    Danke für den Tipp, ich habs mal durch ISpy gejagt und sehe das der Compiler sowas daraus macht (das ganze im Konstruktor)

    C#-Quellcode

    1. CmdProtocol = new RelayCommand(delegate
    2. {
    3. ProtocolExecute();
    4. }, (object a0) => ProtocolCanExecute());


    @ErfinderDesRades
    sowas in der Art habe ich schon im Stack Overflow gelesen, ist natürlich nicht schön wenn immer ein neues Objekt erstellt wird.

    Wäre das dann so wie unten iO?

    C#-Quellcode

    1. private RelayCommand _CmdProtocol=> new RelayCommand(x => ProtocolExecute(), x => ProtocolCanExecute());
    2. public RelayCommand CmdProtocol
    3. {
    4. get
    5. {
    6. return _CmdChangeTenant;
    7. }
    8. }
    mfG.
    Stephan
    jo, abgesehen vom scheusslichen Zeilen-Layout ok, beides.
    letzteres sogar besser, weil readonly, während in vb und in der (korrekten) ilspy-Übersetzung davon die property theoretisch ja auch überschrieben werden könnte.

    wolle mal hübscheres Zeilen-layout gugge?

    C#-Quellcode

    1. private RelayCommand _CmdProtocol=> new RelayCommand(x => ProtocolExecute(), x => ProtocolCanExecute());
    2. public RelayCommand CmdProtocol {
    3. get {
    4. return _CmdProtocol;
    5. }
    6. }
    oder gar

    C#-Quellcode

    1. private RelayCommand _CmdProtocol=> new RelayCommand(x => ProtocolExecute(), x => ProtocolCanExecute());
    2. public RelayCommand CmdProtocol { get { return _CmdProtocol; } }
    Es gibt kein Grund, für so banal-Kram 9 Zeilen zu verbraten.

    oder auch

    C#-Quellcode

    1. private RelayCommand _CmdProtocol=> new RelayCommand(x => ProtocolExecute(), x => ProtocolCanExecute());
    2. public RelayCommand CmdProtocol => _CmdProtocol;

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

    Die einfachste Art, den Fehler zu beheben ist, die Command Property einfach im Konstruktor zu initialisieren.

    C#-Quellcode

    1. ​public RelayCommand CmdProtocol { get; }
    2. public Vm()
    3. {
    4. CmdProtocol = new RelayCommand(x => ProtocolExecute(), x => ProtocolCanExecute());
    5. }


    Hat auch den Vorteil, dass im Vergleich zur => Syntax (public RelayCommand CmdProtocol => new RelayCommand(...); nur eine einzige RelayCommand Instanz erstellt wird, die bei jedem get recycled wird.
    Hallo

    @ErfinderDesRades
    so schaut es natürlich noch besser aus. Für mich bedeutet das gut 500 Commands mit einem Backing Field auszustatten, das wird eine kurze Nacht.

    @shad
    Danke für den Tipp, alles in den Constructor zu packen gefällt mir eigentlich nicht, ich versuche meine Konstruktoren immer recht "schmal" zu halten.
    Was mir allerdings zwecks Vereinfachung meiner ganzen klassen kommt wäre das alles in eine Void zu packen die über den Konstruktor aufgerufen wird, eine Art zentrale Instanzierung...

    Da muss ich mal nachgrübeln.

    Danke für eure Hilfe.
    mfG.
    Stephan
    hi @kaifreeman

    github.com/microsoft/WindowsTe…MVVMBasic/Project/Helpers

    Das ist die Variante die ich nutze, ist von Sibille höchstpersönlich geprüft.

    Ich will mich von Ihr adoptieren lassen... wegen der Codequalität.

    Uuups wieder am Thema vorbei gemogelt. :)

    Observable.cs ist vielen als ViewModelBase bekannt.

    RelayCommand.cs ist hier in einer DeLuxe-Edition, mit und oder ohne Schischi. ;)

    Happy coding...

    c.u. Joshi aus dem fernem PHP-Land... :(

    Joshi schrieb:

    ist von Sibille höchstpersönlich geprüft.

    Watt? Wer soll das denn sein? Da findet man ja gar nicht zu. Im gegensatz zu z.B. Eric Lippert, developing the Visual Basic, VBScript, JScript and C# compilers at Microsoft und The code name "Roslyn" was first written by Eric Lippert, also praktisch einer der Urväter von ganz .NET!

    kaifreeman schrieb:

    das alles in eine Void zu packen die über den Konstruktor aufgerufen wird, eine Art zentrale Instanzierung...


    Gute sache das...

    Ich mache das auch im Konsruktor und rufe dann eine "Init" Methode auf,
    die hat dann alle RelayCommands und eventuelle Messenger-Registrierungen drinne.

    "Ein Konstuktor, sie alle zu knechten und für immer zu binden...", sagte Sauron der alte Miesepeter. ;)

    @Bluespide

    Genau. Wieso kennen wir immer nur die Bills, Konrads und die Steves? Wo bleiben die Sibilles oder Nadines und Chantalles? lol

    Wollte nur eine unbekannte "pushen", diese Frau hat im Windows-Template-Studio sehr viel für die VisualBasic-CodeBase geleistet.

    Kennste Fr. Dollard? Die hat mit unserem Forum-User @loeffel irgendwas mit Visual-Basic gemacht.
    Ich glaube sowas wie eine Weltherrschaftübernahme-API in VB, bei konstanter Temperatur im Heap und im Stack. :whistling: :saint: <3

    github.com/sibille diese nette Programmiererin meinte ich, die hat da wohl ein Auge auf dem Repository. ;)

    c.u. Joshi bald im BuBu-Land... schnarch pfff schnarch pfff :)