Support, Anregungen, Wünsche zur Tutorialreihe <WPF lernen/>

  • WPF MVVM

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

    Nofear23m schrieb:

    Das verstehe ich nicht ganz? Ein ViewModel hat keinen DatenKontext. Wie meinst du das?


    Sorry, ich meinte das Setzen von DataKontext in der View zu einem ViewModel und deren Varianten.

    Wie zum Beispiel in der Application.xaml

    XML-Quellcode

    1. <Application.Resources>
    2. <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    3. <converters:ImageUrlConverter x:Key="ImageUrlConverter" />
    4. <converters:BooleanFlipConverter x:Key="BooleanFlipConverter" />
    5. <DataTemplate DataType="{x:Type viewModels:SerienViewModel}">
    6. <views:SerienView DataContext="{Binding}" />
    7. </DataTemplate>
    8. <DataTemplate DataType="{x:Type viewModels:SettingsViewModel}">
    9. <views:SettingsView DataContext="{Binding}" />
    10. </DataTemplate>
    11. <DataTemplate DataType="{x:Type viewModels:SerieItemViewModel}">
    12. <views:SerieItemView DataContext="{Binding .}" />
    13. </DataTemplate>
    14. <DataTemplate DataType="{x:Type viewModels:StaffelnViewModel}">
    15. <views:StaffelnView DataContext="{Binding}" />
    16. </DataTemplate>
    17. <DataTemplate DataType="{x:Type viewModels:StaffelItemViewModel}">
    18. <views:StaffelItemView DataContext="{Binding .}" />
    19. </DataTemplate>
    20. <DataTemplate DataType="{x:Type viewModels:EpisodenViewModel}">
    21. <views:EpisodenView DataContext="{Binding}" />
    22. </DataTemplate>
    23. </Application.Resources>


    oder das Obligatorische...

    VB.NET-Quellcode

    1. Private ReadOnly Property ViewModel As MainWindowViewModel = New MainWindowViewModel()
    2. Public Sub New()
    3. ' Dieser Aufruf ist für den Designer erforderlich.
    4. InitializeComponent()
    5. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    6. DataContext = ViewModel
    7. End Sub


    und noch dieses für den Designer...

    XML-Quellcode

    1. xmlns:viewModels="clr-namespace:SerienNaGer_Desktop.ViewModels" <-- Achtung! -->
    2. d:DataContext="{d:DesignInstance {x:Type viewModels:MainWindowViewModel},
    3. IsDesignTimeCreatable=True}"


    Sowas dachte ich...

    c.u. Joshi :/
    Achso. Jaja, darauf gehe ich speziell ein, das ist ja immer wieder ein Thema mit MVVM - obwohls ja Simpel ist aber man muss es eben mal gesehen haben.

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

    Und wieder eine Folge Online!

    5.5 - Model - View - ViewModel | Wars das?

    Ich bin auch auf die Frage mit Visibility eingegangen. Nur zur Info
    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. ##

    @Nofear23m
    Schön erklärt. Das ist wirklich ein wichtiges Thema. Wie gesagt , es wird immer von MVVM geredet und gerade diese Details die so wichtig sind für grössere Projekte werden ausgelassen :( . Auch in den Lehrbücher!
    Bin wirklich gespannt auf die weiteren Videos.
    Thanks!
    @Joshi

    Joshi schrieb:

    Sorry, ich meinte das Setzen von DataKontext in der View zu einem ViewModel und deren Varianten.

    haha...ja , anscheinend kommt jeder an diesen Punkt irgendwann mal.
    Ist auch was mit dem Ich mich gerade beschäftige.
    Dafür hab ich jetzt einfach eine Simple Klasse erstellt die ich überall abrufen kann.
    Ist nicht richtig aber fürs erste funktioniert es!
    Es nimmt Window und UserControls an!
    !!Für richtigkeit => kein Gewähr!!!!
    Spoiler anzeigen

    C#-Quellcode

    1. public class DataTemplateService
    2. {
    3. public ContentControl ContentControl { get; set; }
    4. public DataTemplateService(ViewModelBase viewModel , ContentControl contentControl)
    5. {
    6. ContentControl = contentControl;
    7. ContentControl.DataContext = viewModel;
    8. }
    9. }

    Es ist wirklich so das man lange lernen muss und sich von alten Sachen erstmal trennen muss.
    Aber wenn man dran bleibt zahlt sich das auf jeden fall aus.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Amro“ ()

    Amro schrieb:

    Es nimmt Window und UserControls an!

    Und verstößt damit gegen das Pattern. Du holst dir ja die View ins ViewModel.

    Das ViewModel sollte KEINEN Verweis auf eine dll haben die mit WPF oder WinForms zu tun hat.
    Oder befindet sich die Klasse nicht im ViewModel? Dann würde es wieder passen.

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

    Also die Klasse befindet sich in einem
    Ordener/Namespace Service.
    Ich muss sie natürlich im ViewModel irgendwie rein bekommen.
    Dies gescheht über das SelectedItem Objekt.
    Hier ein kleines Diagramm.
    Hoffe ist dadurch etwas verständlich.
    Bilder
    • DatatemplateService.png

      37,3 kB, 838×699, 27 mal angesehen

    Amro schrieb:

    Ich muss sie natürlich im ViewModel irgendwie rein bekommen.

    Das geschied über Services mittels Interfaces.
    Nur so kannst du korrekt abstrahieren.

    Kommt aber eh bald im Tutorial ;)

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

    Nofear23m schrieb:

    Das geschied über Services mittels Interfaces.

    Ah ok.
    Ich will nichts vorweg nehmen,würde mich gerne daran versuchen und das Projekt hochladen.
    Vielleicht ist dann der eine oder andere Anfängerfehler im Projekt den du dir anschauen kannst ?
    Will aber niemand in die falsche Richtung lenken oder was falsches vermittlen.

    Nofear23m schrieb:

    Kommt aber eh bald im Tutorial

    Da sag ich nur :thumbsup: :thumbsup:
    Hallo

    Kannst ja gerne einen Thread aufmachen mit dem Titel: Datenkontext vom ViewModel aus steuern

    Mach aber bitte wenn möglich ein kleines Minimalprojekt welches die Konstellation veranschaulicht damit sich jeder zurechtfindet.

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

    Das Wort zum Sonntag:

    Das Kapitel 5.6 - Anlegen eines MVVM Projekts unter Visual Studio ist Online!

    Und.... wir werden das Projekt diesmal unter .Net 5 erstellen!!

    Hoffe es wird euch gefallen!!
    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. ##

    Ein kleiner Fehler ist mir aufgefallen.
    Du schreibst das Projekt .App hat einen Verweis auf Model, ViewModel und View. Es werden doch nur View und ViewModel benötigt, oder nicht?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo

    Gut aufgepasst!!

    Im Grunde ja, im Beitrag habe ich es glaube ich nicht explizit dazugeschrieben, aber im Video erwähnt, der Vorteil wenn ich einen Verweis auf alle Projekte setze ist das die dlls beim Kompilieren automatisch in das Ausgabeverzeichnis der EXE kopiert werden. Ohne Verweis müsste man dies Händisch oder per Post-Anweisung erledigen. Nachteil sehe ich im Fall der exe sowieso keinen, diese kann ruig alles kennen.

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

    Bei mir ist das so, das ich in der App kein Verweis auf das Model gesetzt hab.
    Das Model wird aber trotzdem mitkopiert.
    Liegt warscheinlich daran weil ViewModel, ein Verweis auf Model hat.

    Um das ganze weiter zuspinnen , reicht nur der Verweis auf die View.
    Weil die kennt ja das ViewModel und das ViewModel kennt das Model.
    Somit werden alle Dll's mitkopiert.
    Bilder
    • Model.png

      9,63 kB, 334×265, 33 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Amro“ ()

    Amro schrieb:

    Liegt warscheinlich daran weil ViewModel, ein Verweis auf Model hat.

    Ist richtig und funktioniert unter .Net Core und .Net 5 aber bei .Net Framework gibt es da immer wieder probleme und die Dateien werden gerne mal nicht mit kopiert. Deshalb mache ich es im Tutorial so das es für alle passt.

    Und da die App sowieso sowohl das ViewModel auch kennen MUSS, bleibt nur noch das Model übrig, und das kan man verkraften, vorallem weil dies weder bei UnitTests stört noch sonst irgendwie denn die App selbst kann gerne alle möglichen Verweise haben, die stören in keinster Weise und verletzen das Pattern auch nicht.

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

    Amro schrieb:

    Wirst du Entity Framework einsetzten?

    Gegenfrage. Schon das Inhaltsverzeichnis angesehen?

    Edit: OK, das war gemein, habs nicht genau spezifiziert. Ab Kapitel 9!
    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. ##

    Gonger96 schrieb:

    und du sparst dir unnütze Verweise.

    Naja, weis nicht ob so unnütz.

    ViewModel und View brauchste sowieso, und spätestens beim ersten Service dem ich ein ModelBase As T übergeben muss bräuchte ich einen Verweis auf das Model wenn ich dies nicht abermals abstrahieren möchte, aber da würde ich jetzt zu weit vorgreifen.
    Aber du hast recht, das funktioniert so, habe aber wie gesagt immer wieder mal probleme gehabt unter .Net Framework weshalb ich das hier zur Sicherheit so gemacht habe um unnötige Supportanfragen zu verhindern.

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

    Ich habe mal ein Projekt nach deiner Anleitung aus dem Video erstellt. Einziger Unterschied zu meinem vorherigen Vorgehen ist das du für das Model und ViewModel normale Klassen nutzt und ich bisher immer die WPF-Klassen.
    Nun ist mir aufgefallen das bei den normalen Klassen meine RelayCommand Klasse nicht mehr funktioniert trotz des System.Windows.Input Imports. Der CommandManager ist dort irgendwie nicht verfügbar. In der WPF-Klasse hingegen funktioniert das schon.
    Wie wird das denn bei normalen Klassen gelöst?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.