WPF MVVM Projekt-Architektur, Code Behind

  • WPF MVVM

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

    WPF MVVM Projekt-Architektur, Code Behind

    Hey,

    bin noch dabei mich mit MVVM vertraut zu machen, dabei stoße ich grad auf ein Problem, welches mich zwingt Code Behind einzusetzen, auf welchen ich erst verzichten wollte.

    Diese Sache ist die: Anfangs hatte ich aus Bequemlichkeit, alles in einem Projekt. Das führte dazu das ich einfach in einem ViewModel eine Instanz von einem 2. Window anlegen konnte. Nachdem ich mich entschloss eine Solution mit mehreren Projekten anzulegen, stellte ich fest, das wenn alles in einem Projekt ist, die ViewModels die Views kennen, mehr oder weniger. Bei einzelnen Projekten kann man ja keine RingVerweis machen, also wenn Projekt A einen Verweis auf Projekt B hat, kann in B kein verweis auf A gemacht werden. So kennen ViewModels nicht die Views, was mich dann dazu zwingt CodeBehind einzusetzen um weitere Windows zu nutzen, da es ja reine Logik für die Views ist, halte ich das für akzeptabel.

    Beispiel für Code Behind, wenn ein Command von einem Button ausgeführt wird, werfe ich im ViewModel ein Event um die View zu informieren das 2. Fenster zu zeigen.
    Spoiler anzeigen

    C#-Quellcode

    1. public partial class MainWindow : Window
    2. {
    3. public MainWindow()
    4. {
    5. InitializeComponent();
    6. }
    7. private EqualizerWindow equalizerWindow;
    8. private void EqualizerWindowClosed(object sender, EventArgs e)
    9. {
    10. equalizerWindow = null;
    11. }
    12. public void OnShowEqualizer_Clicked(object sender, EventArgs e)
    13. {
    14. if (equalizerWindow != null)
    15. {
    16. return;
    17. }
    18. equalizerWindow = new EqualizerWindow();
    19. equalizerWindow.Closed += EqualizerWindowClosed;
    20. equalizerWindow.Show();
    21. ((ViewModels.ViewModelMaster)DataContext).viewModelEqualizerWindow = (ViewModels.ViewModelEqualizerWindow)equalizerWindow.DataContext;
    22. }
    23. private void Window_Loaded(object sender, RoutedEventArgs e)
    24. {
    25. ((ViewModels.ViewModelMaster)DataContext).viewModelMainWindow.OnShowEQClicked += OnShowEqualizer_Clicked;
    26. }
    27. private void Window_Closed(object sender, EventArgs e)
    28. {
    29. if (equalizerWindow != null)
    30. {
    31. equalizerWindow.Close();
    32. }
    33. }
    34. }



    Wie baut ihr eure Solutions auf? Einzelnes Projekt oder auch mehrere? Setzt ihr CodeBehind ein? Falls ja, unter welchen Umständen?
    Ich würde dir jetzt gerne eine TestSolution hochladen, aber unser Internet ist noch die nächsten 5 Wochen tot. Daher nur vom Handy.

    ich bauen meine MVVM Struktur mit einzelnen Projekten auf.
    Projektname.App, Projektname.Model, Projektname.VieModel, Projektname.View

    Ich nutze bisher keinen CodeBehind.
    Wenn du mehrere Windows oder Dialoge hast löst man das mittels Services.
    Schau mal in die Tutorialreihe von @NoFear23m. Da gibt es bereits die Services.
    Tutorialreihe <WPF lernen/>

    Ansonsten versuche ich später mal etwas genauer zu beschreiben. Ist vom Handy echt mühselig.

    Edit: Schau dir auch mal das Tutorial zu den Commands an.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

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

    Ja, das mit den Services ist das fehlende Konstrukt in meinem Projekt. Bis zu den Service ist NoFear23fm ja bereits beim Tutorial. Das bau ich direkt mal ein. Mit den Commands, das bekomme ich bereits gut hin, das mit den Bindings auch. Ich muss sagen nachdem ich soweit durchblicke, WPF mit MVVM Pattern ist einfach genial ^^
    Ja, die Services wurden bereits im Tutorial durchgenommen.
    Damit musst du auch KEIN CodeBehind machen wenn du die gut aufbaust.

    Bei Fragen gibt es ja den Supportthread auch.

    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. ##

    Hallo

    Die Command Klassen kannst du dir sparen wenn du lit RelayCommands arbeitest. Dazu habe ich ein eigenes Kapitel.

    Grüße
    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. ##