Binding einer Collection mit Usercontrolls an eine Listbox

  • WPF

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

    Binding einer Collection mit Usercontrolls an eine Listbox

    Hallo

    Die Tuturials von Sascha Patschka/Nofear23m haben mir ja schon recht weit geholfen. Ich häng jetzt an einer Stelle wo mit die Phantasie fehlt.
    (Habe ein Bastelproject als zip angehangen. Hier poste ich Auszüge daraus)

    Also ich habe wie so oft mehrere "Personen objekte" mit den überlichen Properties: Refnr, Vorname, Nachsname usw.
    Diese kommen in Gruppen rein. Diese wiederrum in Gruppensammler.

    Code Auszug
    1 Person

    VB.NET-Quellcode

    1. Public Class clPerson
    2. Private _RefNr As String = ""
    3. Private _VorName As String = ""
    4. Private _GeburtsName As String = ""...


    x Personen >> 1 GruppeDim

    VB.NET-Quellcode

    1. Public Class clGruppe
    2. Dim _liste As New ObservableCollection(Of clPerson)
    3. Public Property Items As ObservableCollection(Of clPerson)
    4. Get
    5. Return _liste
    6. End Get
    7. Set(value As ObservableCollection(Of clPerson))
    8. _liste = value
    9. End Set
    10. End Property
    11. End Class


    x Gruppen >> Gruppensammler

    VB.NET-Quellcode

    1. Public Class clGruppeSammler
    2. Dim _liste As New ObservableCollection(Of clGruppe)
    3. Public Property Items As ObservableCollection(Of clGruppe)
    4. Get
    5. Return _liste
    6. End Get
    7. Set(value As ObservableCollection(Of clGruppe))
    8. _liste = value
    9. End Set
    10. End Property
    11. End Class


    Es existieren zu allen 3 Klassen jeweils User Controls welche die enthaltenen Daten anzeigen sollen.
    (Ich spare mir den ganzen Code da ich denke das es im Project selbst übersichtlicher ist anzuschauen.)

    Also die ucPerson werden horizontal in der ucGruppeangezeigt.Sind erstmal bunt gemacht.
    Die Gruppen im/des Sammlers sollen senkrecht aufgelistet werden (und hier hackt es)

    in der WPF Hauptform habe ich erstmal starr jeweils eine Gruppe und Sammler eingebaut:

    XML-Quellcode

    1. <local:ucGruppe x:Name="GruppenTester1" Height="100"/>
    2. <local:ucGruppenSammler x:Name="GruppenSammlerTester1" />

    GruppenTester1 funktioniert soweit

    Sinn des Ganzen soll sein das ich immer eine aktuelle Sicht auf der Oberfläche zu meinem Datenbestand habe.
    Statt Listboxen hatte ich erst Stackpanel im Sinn. Hab ich leider nicht hinbekommen. Bin auch nicht sicher ob es überhaupt besser geeignet wäre.
    Mein Hauptproblem ist im Moment das der GruppenSammler es nicht anzeigt. Da geht irgendwas ins leere.
    Auch bin ich offen gegenüber sonstigen Verbesserungen. Nur bitte nicht mit dem MVVM Geschütz kommen :D

    Danke und Gruß
    Dateien
    • Tester.zip

      (341,14 kB, 85 mal heruntergeladen, zuletzt: )

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

    Prive schrieb:

    in der WPF Hauptform habe ich erstmal starr jeweils eine Gruppe und Sammler eingebaut
    Jo, und dassis der Fehler.
    In Wpf würde man eine Listbox machen mit einem Itemtemplate für GruppenSammler, und die an die GruppenSammler binden. Also das ItemTemplate müsste dein ucGruppenSammler enthalten.
    Dann zeigt die Listbox die GruppenSammler an.



    Mir scheint allerdings die Useability fragwürdig: Willst du wirklich 3-dimensional verschachtelte Listboxen anzeigen? Also eine Listbox, deren Items je eine Listbox enthalten, deren Items auch wieder je eine Listbox enthalten??
    Hallo @Prive

    Prive schrieb:

    Die Tuturials von Sascha Patschka/Nofear23m haben mir ja schon recht weit geholfen.

    Das ist schön, du musst nur das in meinen Tutorials geschriebene und gesagte auch umsetzen. Ich sehe da in deinem Projekt NIRGENS ein Binding. Warum?
    Ist doch in deinem Fall viel einfacher!! Vorallem weil die Kapitel mit und ums Binding bereits fertig und Online sind. Ich glaube du musst nochmals lesen. Aber gut.

    Prive schrieb:

    Es existieren zu allen 3 Klassen

    Super, du hast schon mal Klassen, das ist gut. Bitte implementiere noch INotifyPropertyChanged, dann passt es auch, sonst suchst du später ewig nach dem Fehler.

    Zu deinem Projekt:

    Im grunde musst du nur im MainWindow ein Binding herstellen:

    VB.NET-Quellcode

    1. ...
    2. ...
    3. gr3.addNewPerson("lisa", "fass", 31)
    4. gr3.addNewPerson("birgit", "find", 2)
    5. gr3.addNewPerson("otto", "fuel", 44)
    6. '-----------------------
    7. 'GruppenTester1.lstb1.ItemsSource = gr1.Items 'Vergiss das gleich wieder
    8. 'GruppenSammlerTester1.lstb1.ItemsSource = mGruppenSammler.Items 'Das auch
    9. Me.DataContext = mGruppenSammler 'Window auf Gruppensammler Binden


    Im MainWindow ganz simpel:

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:Tester"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <local:ucGruppenSammler x:Name="GruppenSammlerTester1" DataContext="{Binding}"/>
    10. </Window>
    11. In den UserControls einfach nur: [tt] <ListBox x:Name="lstb1" ItemsSource="{Binding Items}">[/tt]
    12. Das wars:
    13. [attach=44398][/attach]
    14. Grüße
    15. Sascha
    Bilder
    • sc.PNG

      13,36 kB, 396×446, 82 mal angesehen
    Dateien
    • Tester.zip

      (337,18 kB, 80 mal heruntergeladen, zuletzt: )
    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. ##

    ErfinderDesRades schrieb:



    Mir scheint allerdings die Useability fragwürdig: Willst du wirklich 3-dimensional verschachtelte Listboxen anzeigen? Also eine Listbox, deren Items je eine Listbox enthalten, deren Items auch wieder je eine Listbox enthalten??

    Eigendlich kommen da sogar noch ein paar Ebenen drüber. Jeder Ebene ist vom Typ eine unterschiedliche Objektauflistung.In der Anzeige dann halt mit Listboxen, oder irgendwelche Panel.
    Wollte erstmal das Grundlegende mit der Kaskadiererei hinbekommen.
    Also es ist so. Die Datenhaltung ist einem anderen Format.
    Dieses Objektkonstrukt wird je nach Auswahl im Programm dynamisch von diversen Funktionen befüllt und stellt von der logischen Struktur die "Karte" dar welche ich dann auch "graphisch" sehen möchte.
    Es können da schon Übersichten mit mehreren tausend Personen rauskommen. Mal schauen wie weit das mit WPF gutgeht.

    Nofear23m schrieb:


    Das ist schön, du musst nur das in meinen Tutorials geschriebene und gesagte auch umsetzen. Ich sehe da in deinem Projekt NIRGENS ein Binding. Warum?
    Ist doch in deinem Fall viel einfacher!! Vorallem weil die Kapitel mit und ums Binding bereits fertig und Online sind. Ich glaube du musst nochmals lesen. Aber gut.


    Naja die Umsetzung ist vor allem das ich die Controls nicht mehr via Drag und Drop reinziehe :D.
    Ich hab schon recht viel rumgebastelt. Aber meinen den ganzen Schrott halt wieder rausgenommen weils nicht ging. ;)

    Ich habe gerade festgestellt das ich in den 3 UserControlls die Collections und Propertys im CodeBehind garnicht brauche.

    Danke für die Antworten. Es hilft mir weiter auch wenn ich schon die nächsten Fragen im Hinterkopf habe. Aber kämpfe erstmal wieder ein wenig selbst. ;)
    Oh, sorry. In die CodeBehind der UCLs hab ich gar nicht reingesehen, bin gewohnt das da nix drinnen steht.

    Wenn du mit WPF was machen willst tu dir selbst den gefallen und gehe mein Tutorial Kapitel für Kapitel durch. Es hat einen Grund warum ich es so aufgebaut habe wie es ist. Und Arbeite nur mit Binding, alles andere hat wenig sinn und sollte nur in ausnahmefällen zum Einsatz kommen.

    Wenn du dann wo nicht weiter weist helfen wir dir *hast du ja gesehen*
    Aber mach es von Anfang an richtig, später umlernen ist nich schwieriger. Glaub mir, ich musste es schmerzhaft lernen.

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