WPF Anwendungsdesign - Verständnisproblem von Bindings und Klassendesign

  • WPF

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

    WPF Anwendungsdesign - Verständnisproblem von Bindings und Klassendesign

    Hallo!

    Ich versuche gerade eine meiner bestehenden Anwendungen auf aktuellen Stand zu bringen und mehr mit Klassen zu arbeiten. Bisher habe ich mich sehr gut davon fern halten "können" - das hab ich nun davon. Früher oder später braucht mans halt doch..
    Naja, bin erst "während" dem werkeln auf die großen Unterschiede zwischen WinForms und WPF Aufmerksam geworden und weiß nicht ob mein Ansatz diesen Anforderungen noch stand halten kann... Aber gut, das mal als Einleitung...

    Aktuell habe ich folgenden Ansatz im Programm gewählt, ich hole auch hier ein wenig weiter aus um falsche Denkansätze aufgezeigt zu bekommen (in Laiensprache, bin noch nicht sehr Programmier gefestigt)...
    Beim Start des Programms lese ich ein JSON File welches Daten an eine "Public" Variable einer Datenklasse bindet welche die Konfiguration für die späteren Elemente bereit hält.
    Das bringt mich zum ersten "Problem" bzw. Designfehler? Je nach Subklasse (z.B. Setting.Klasse1 bzw. Setting.Klasse2) habe ich die gleiche Datenstruktur, muss aber unterschiedliche Werte bereit halten.
    Codebeispiel:

    VB.NET-Quellcode

    1. Private Sub BindToKlasse1()
    2. cmbLic.ItemsSource = Setting.Klasse1.licenses
    3. cmbApplication.ItemsSource = Setting.Klasse1.SubApplications
    4. cmbApplication.DisplayMemberPath = "Key"
    5. cmbApplication.SelectedIndex = 0

    VB.NET-Quellcode

    1. Private Sub BindToKlasse2()
    2. cmbLic.ItemsSource = Setting.Klasse2.licenses
    3. cmbApplication.ItemsSource = Setting.Klasse2.SubApplication
    4. scmbApplication.DisplayMemberPath = "Key"
    5. cmbApplication.SelectedIndex = 0

    Lässt sich das dynamischer gestalten? Kann ich mit einem "Knopfdruck" direkt die Unterklasse wechseln? Dann spare ich mir das ändern der Itemsource.

    Des weiteren muss ich dann Daten dynamisch aus den zuvor eingelesenen Werten erstellen. Dazu muss ich eine neue Klasse erstellen, denke ich. Folgendes Pseudo-Code Beispiel habe ich dafür:

    VB.NET-Quellcode

    1. Class DataGridViewData
    2. Public Property Column1 = DoSomething(Setting.Klasse1.licenses)
    3. Public Property Column2 = DoSomething(Setting.Klasse1.SubApplications)
    4. End Class

    Ist das der richtige Ansatz? Wie greife ich von der Klasse dann überhaupt auf die zuvor instanzierte Public-Variable (In dem Fall "setting") zu?

    Danke schon mal - ich bin mir sicher es werden weitere Fragen auftauchen aber das wären mal wohl die wichtigsten die es für mich zu klären gilt.

    Bisher habe ich viel mit "x:Name" gearbeitet, das ist aber kein guter Ansatz wie ich jetzt immer mehr feststellen durfte..
    Hallo

    Schau dir mal meine Tutorialreihe an. Insbersonders die Kapitel mit Binding(!!)

    Zeig mal deine Setting-Klasse und erklre was genau du machen willst.
    Im Moment denke ich du hast eine reihe Controls auf deinem Window welche mit den Werten aus der Settings-Klasse gefüllt werden, und du willst quasi von Settings1 auf Settings2 umschalten.
    bzw. auf x Setting Instanzen.

    Ist das richtig. Vieleicht mach mal nen Screenshot damit man weis was du willst.
    Das gibt es sicher VIEL bessere Möglichkeiten mittels Binding.

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

    Danke für eure Antworten. Habe das grundsätzlich vorerst an meine Datenklasse gebunden. Die sieht wie folgt aus:

    VB.NET-Quellcode

    1. ​Class Settings
    2. Public Property GeneralSettings As New GeneralSettings
    3. Public Property CATIA As New CADEnvironment
    4. Public Property NX As New CADEnvironment
    5. Public Property SolidWorks As New CADEnvironment
    6. Public Property Collaboration As New ApplicationSettings
    7. Public Property Licenses As New ApplicationSettings
    8. End Class
    9. Class GeneralSettings
    10. Public Property DSLSPath As String
    11. Public Property LMUTILPath As String
    12. Public Property ALMUTILPath As String
    13. Public Property LocalDestination As String
    14. Public Property OnlineSource As String
    15. Public Property CADDocs As String
    16. Public Property CADManual As String
    17. Public Property SpaceRequiredInGB As Integer
    18. Public Property Admins As New List(Of String)
    19. End Class
    20. Class CADEnvironment
    21. Public Property Environment As New List(Of Tuple(Of String, String, String))
    22. Public Property Licenses As New List(Of String)
    23. Public Property SubApplications As New List(Of KeyValuePair(Of String, String))
    24. End Class
    25. Class ApplicationSettings
    26. Public Property Environment As New List(Of Tuple(Of String, String, String))
    27. End Class


    Vermutlich müsste ich für die von dir, @ErfinderDesRades , zitierte Zeile eine eigene Klasse erstellen und diese dann per Code ansprechen und den darauf verwiesenen Wert ändern? In der XAML ist somit immer die View-Klasse verlinkt? Muss ich dafür also ständig Public Variablen erstellen?

    @Nofear23m Ich greife mit einer Datagridview auf die oben angeführte Klasse zu. z.B. auf Setting.CATIA.Environment - Von dort lese ich Werte ein und mit diesen werten arbeite ich dann teilweise in einer neuen Spalte weiter.
    Auch hier müsste ich iene neue Klasse erstellen die diese Werte zur Verfügung stellt und mittels XAML eingebunden wird?

    ery schrieb:

    Vermutlich müsste ich für die von dir, @ErfinderDesRades , zitierte Zeile eine eigene Klasse erstellen und diese dann per Code ansprechen und den darauf verwiesenen Wert ändern?
    Nein überhaupt nicht.
    Die von mir zitierte Zeile kommt weg, und stattdessen setzst du im Xaml-Designer der Listbox.ItemSource ein Binding.

    Prinzipiell wie hier gezeigt: Grundlagen - MVVM: "Binding-Picking" im Xaml-Editor

    Wie gesagt: Vorraussetzung dafür ist, dass das Konzept "Viewmodel" verstanden ist, und dass ein Viewmodel existiert, und (so mache ichs immer) das "MainViewmodel" in die Resources der App.Xaml gelegt ist.
    @ery

    Das passt ja im Grunde so.
    ICh würde ein ViewModel erstellen welches die "Seting" Instanz hält und die einzelnen Klassen per Binding und DataTemplates binden. Funzt tadellos.
    Wie gesagt. Schau dir die Tutorialreihe an und versuche mal Binding zu verstehen, das benötigst du. Weiters noch DataTemplates.

    Probier damit mal rum und melde dich wenn du was nicht versthst im SupportThread. Für sonstuige Fragen kannst du gerne einen Thread aufmachen.
    Aber du MUSST die WPF verstehen lernen, insbersonders Binding. Sonst wird dir die WPF keinen spass machen. Es ist nicht schwer wenn man mal weis wie es geht und macht dann richtig spass aber die Grundlagen müssen nun mal sein.

    Wenn du dann wo nicht weiterkommst kannst du dich ja jederzeit melden.

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