Erste Schritte WPF (Datenbindung mit DataSet? / Verschachteltete Anzeige)

  • WPF
  • .NET 7–8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Erste Schritte WPF (Datenbindung mit DataSet? / Verschachteltete Anzeige)

    Hallo,

    habe nun ein wenig mit WPF rumprobiert. Ich konnte auf dürftige Art und Weise ein Parent-Child-View basteln. Hätte in diesem Zusammenhang aber einiges an Fragen.

    Erstmal mein Code:
    Data Klasse

    VB.NET-Quellcode

    1. Public Class Data
    2. Private Shared _DS1 As New DataSet1
    3. Private _OPakete As ObservableCollection(Of Paket)
    4. Public Sub New()
    5. _DS1.Clear()
    6. _DS1.ReadXml("pfad")
    7. _OPakete = New ObservableCollection(Of Paket)
    8. For Each p In _DS1.Paket
    9. _OPakete.Add(New Paket(p.ID, _DS1.Objekt.Where(Function(x) x.PaketID = p.ID)))
    10. Next
    11. End Sub
    12. Public ReadOnly Property Paket As ObservableCollection(Of Paket)
    13. Get
    14. Return _OPakete
    15. End Get
    16. End Property
    17. End Class

    Paket Klasse

    VB.NET-Quellcode

    1. Public Class Paket
    2. Public Property ID As Integer
    3. Public Property Inhalt As ObservableCollection(Of DataSet1.ObjektRow)
    4. Public Sub New(id As Integer, inhalt As IEnumerable(Of DataSet1.ObjektRow))
    5. _ID = id
    6. _Inhalt = New ObservableCollection(Of DataSet1.ObjektRow)
    7. For Each o In inhalt
    8. _Inhalt.Add(o)
    9. Next
    10. End Sub
    11. End Class

    MainWindow

    XML-Quellcode

    1. ...
    2. DataContext="{Binding Source={StaticResource Data1}}">
    3. <Grid>
    4. <Grid.ColumnDefinitions>
    5. <ColumnDefinition Width="*"/>
    6. <ColumnDefinition Width="*"/>
    7. </Grid.ColumnDefinitions>
    8. <ListBox Grid.Column="0" ItemsSource="{Binding Paket}" DisplayMemberPath="ID" IsSynchronizedWithCurrentItem="True" Margin="10">
    9. </ListBox>
    10. <ListBox Grid.Column="1" ItemsSource="{Binding Path=Paket/Inhalt}" DisplayMemberPath="Bezeichnung" Margin="10">
    11. </ListBox>
    12. </Grid>


    Frage 1:
    Ist das noch/schon MVVM?

    Frage 2:
    In einem Sample von Edr wird sehr darauf geachtet wie die Modelldaten instanziert werden. Vielleicht ist die Frage auch besser direkt an @ErfinderDesRades gerichtet. Ich hab da jetzt einfach eine ganz normale Sub New für mein "Mainmodel". Warum darf das nicht mehrfach instanzierbar sein?

    Frage 3:
    Ich hab jetzt extra eine Paket Klasse gemacht damit ich die Objekte im Paket als eine Eigenschaft von Paket einrichten kann. So kriegt das MainWindow die Parent-Child Beziehung hin zwischen den beiden Listboxen.
    Die Datenbasis sind hingegen wie man es gewohnt ist zwei Tabellen mit Fremdschlüsselbeziehung.
    Gibt es die Möglichkeit da die Datenbindung schon aus dem DataSet hinzukriegen?
    Denn sowohl die Tabelle Paket und die Tabelle Objekt sind ja bereits Properties des DataSets. Ich kann statt der Data Klasse die DataSet Klasse als DataContext verwenden, allerdings fehlt so eine Parent-Child-Beziehung zwischen den Listboxen bzw. weiß ich nicht wie das dann ginge.

    Frage 4:
    Was ich ultimativ möchte, ist nicht zwei Auflistungen nebeneinander anzeigen, sondern die eine Auflistung in der anderen zu verpacken.
    Quasi eine Tabelle als Paketzeilen, aber eine jede solche Zeile kann man dann aufklappen, um die Inhalte dieses Paketes zu sehen.
    Welches Control muss ich dafür verwenden, ist der TreeView der richtige?

    Viele Grüße
    1) ja - ist MVVM. Zumindest was in meinen Augen das Wesentliche daran ist.
    Mancher mags als unvollständig empfinden, weil in voll entwickeltem MVVM ist Model-View-ViewModel unterscheidbar.
    Ich sehe diese Unvollständigkeit hier als Vorteil, weil hier ist nichts gecodet, was keine praktische Funktion hat (und das träte ein, wenn man hier den MVVM unbedingt voll entfalten wollte).
    Gleichzeitig ist die Möglichkeit zur vollständigen Entfaltung nicht verbaut.

    2) Zum einen: Angenommen, du hättest 2 Mainmodel-Instanzen mit Änderungen. Welche speicherst du ab? Was soll mit der anderen, nicht abgespeicherten passieren? Hast du ühaupt Kontrolle, welche der beiden Instanzen Änderungen enthält?
    Zum zweiten: Redundanz ist immer von Übel, und Daten-Redundanz sowieso.Solch hat immer die fatale Neigung, dass du die einen Daten anguckst, und die anderen Daten verarbeitest. Alles funktioniert - keine Fehlermeldung - aber äh: nicht richtig. Zu debuggen extrem unerfreulich.

    3) Leider wird typDataset von Wpf nicht richtig unterstützt. Tatsächlich kann man Bindings auch vollständig gegen DataRows setzen, aber die Intellisense ist flöten, und dadurch wird das ein ziemliches Fischen im Trüben.

    4) also du willst keinen ParentChildView? Ja, dann bleibt ja nur ein Treeview.
    Achnee - das mit dem Aufklappen geht auch im Wpf-Datagrid.
    Bei Wpf gibts statt BindingSource die ListCollectionView, und die hat auch Eigenschaften zum Gruppieren.
    Also es gibt im DG die Möglichkeit zu gruppieren, und Gruppen auf/zu zuklappen. Und als Datenhintergrund sind dafür CollectionViews vorgesehen (wie überhaupt für den Datenfluss).
    Das ist aber ein anspruchsvolles Thema, mit Styles und Templates biste da unterwegs.
    Zum Beispiel musste dir dann klarmachen, dass dein DG dann nicht Pakete anzeigt, sondern Paket-Inhalte.
    Und die Paket-Inhalte werden gruppiert zu Paketen - sorum.
    kannst auch mit Startpage suchen: "grouping in wpf datagrid"
    guck - da gibts sogar was von MS: learn.microsoft.com/de-de/dotn…w=netframeworkdesktop-4.8
    Achtung bei MS: Es funktioniert immer, was die vormachen, aber sehr oft, ginge es auf andere Weise wesentlich einfacher. Also achte drauf - ich selbst hab den Artikel nicht durchgearbeitet, kann also nicht sagen, obs das auch so ein Beispiel ist.

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

    Zu 2 noch: Nur weil eine zweite Instanz möglich ist, heißt es ja nicht, dass so eine überhaupt erzeugt wird.
    Das ist denke, was ich nicht verstehe. Ich könnte zwar eine zweite Instanz machen, aber das passiert doch nicht unwissentlich bei obigen Beispiel, oder?
    (Was abspeichern angeht, das habe ich noch gar nicht bedacht. Wie so oft ist es bei mir mal wieder nur gucken nicht anfassen.)

    Das DataGrid werde ich dann gerne mal versuchen.

    Haudruferzappeltnoch schrieb:

    Zu 2 noch: Nur weil eine zweite Instanz möglich ist, heißt es ja nicht, dass so eine überhaupt erzeugt wird.
    Zur Designzeit haste es nicht wirklich unter Kontrolle.
    Wenn du zwei Views bastelst, bindest du beide ja an letztlich das Mainviewmodel. Man weiss aber nicht, wie und wann der Xaml-Designer die MainModelse bereitstellt, an die da gebunden wird (beachte die Paradoxie der Wortwahl "die Mainmodelse").
    Ist lange her, aber ich glaub ich hatte da gelegentlich komische Effekte. Da spielt auch Cashing mit rein, also mal hat der XamlDesigner ein MainModel im Cache, und bindet vlt. zwei views richtig an dasselbe, und andermal ists dann anders.

    Ja, aber wenn du gut genug aufpasst, dass keine Multi-Mainmodels entstehen, dann ist ja gut.
    Wie gesagt: Ich arbeite inzwischen nurnoch mit Singletons. Xaml kann das inzwischen - war nicht immer so.