WPF Datenbank

  • WPF

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

    WPF Datenbank

    Hallo Leute


    Ich habe vor eine Datenbank in WPF anzuzeigen.
    Links in der Listbox sollen die Tabellen angezeigt werden.
    Rechts in der DataGrid soll der Inhalt der Tabellen angezeigt werden.

    Ich hab jetzt mal eine kleine Projektmappe vorbereitet und
    möchte darauf aufbauen.

    Wie baue ich jetzt am besten mein Model/ViewModel auf.
    Kann ich wie aus Windows-Forms gewohnt einfach eine Datatable füllen
    und dann binden?

    Gruß Amro

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

    Täte ich nicht empfehlen. In Wpf sollte man seine Anwendung nach dem MVVM-Pattern aufbauen.
    Das ist im Wesentlichen auf der einen Seite ein Datenmodell der Anwendung - ein System von Klassen, die sich prinzipiell so verhalten, wie der Geschäftsvorgänge, den du abbilden willst.
    Und dann eine Xaml-Oberfläche, die an dieses Datenmodell bindet (und dadurch die Geschäftsvorgänge sichtbar macht).

    Normalerweise braucht man auch deutlich mehr Differenzierung, als nur links die Liste der Tabellen, rechts die ausgewählte Tabelle.
    Bist du sicher, dass dieser "Datenbank-Viewer" das ganze Konzept deiner Anwendung ist?

    Achso - und dann arbeitet Wpf nicht in brauchbarer Weise mit DataTables zusammen. Du müsstest EF verwenden.

    ErfinderDesRades schrieb:

    Täte ich nicht empfehlen. In Wpf sollte man seine Anwendung nach dem MVVM-Pattern aufbauen.

    Ok!
    Es wäre mir lieber ohne Entity Framework, da ich es noch nie benutzt hab und ich wieder von Thema abgelenkt werde.
    Aber für die Liste der Tabelle reicht erstmal eine List(of String).
    Korregier mich bitte wenn ich falsch liege.

    ErfinderDesRades schrieb:

    Bist du sicher, dass dieser "Datenbank-Viewer" das ganze Konzept deiner Anwendung ist?

    Es soll schon etwas mehr werden.
    Als erstes wollte ich nur die möglichkeit schaffen in einem Window die Datenbank anzusehen.
    Für den Anfang als Übung.
    Nachher natürlich noch mehr Abfragen und Hinzufügen von Daten (CRUD).
    Vielleicht noch ein Diagramm und Reports zum Ausdrucken.

    Im Prinzip brauch ich jetzt erstmal Hilfe beim Aufbau der Solution und den Datenmodell.
    Das Fundament sollte stimmen damit ich auch vielleicht für zukünftige Projekte eine Vorlage hab.
    Hallo @Amro

    Im Grunde ist es egal wie du die Daten abrufst. Ob nun über EF oder ganz "alte Schule" über DataReader. Wie auch immer. Wenn du die Daten hast füllst du dein ViewModel.
    Das ViewModel übernimmt die Aufbereitung für die View. Die View (dein XAML) ist an das ViewModel gebunden.

    Auch das zurückschreiben der geändeten Daten übernimmt in diesem Fall das ViewModel. Ohne einem Framework wie EF musst du hald selbst zusehen das du "mitbekommst" welche Daten sich geändert haben und diese wieder in die DB zurückschreiben.

    Also in erster Linie musst du emal die Techniken des Bindings auf die Reihe bekommen, ohne Binding geht in der WPF nicht viel.

    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 hab es jetzt hinbekommen die Liste direkt an das Model zu binden.
    mit dem ViewModel ist mir noch nicht ganz klar wie ich das machen soll.
    Arbeite aber drann!
    Wäre das soweit Ok mit der Bindung.
    Wird es so gemacht

    Edit: Ok jetzt auch mit den ViewModel :)

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

    Ich kann es mir erst am Nachmitag ansehen da ich im Moment an einer temporären Workstation arbeite ;(

    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 Amro

    Ja, klar ist das so korrekt. Funzt ja auch wie du siehst. Einzig die Benamsung/Einordnung würde ich ein wenig kritisieren.

    Dein "NordwindModel" ist so gesehen eher ein ViewModel als ein Model da es Logik enthält wie in deinem Fall Daten zu laden. Models sind eher reine POCO Klassen.

    Also einfache Klassen welche einfach nur Eigenschaften enthalten. Wie für Person: Firstname, Lastname, Birthday usw.
    Ein ViewModel läd Daten und bereitet diese für die Anzeige auf. Und genau das macht dein "NordwindModel".

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

    Erstmal danke für's Reinschauen in die Solution.

    Nofear23m schrieb:

    Dein "NordwindModel" ist so gesehen eher ein ViewModel


    Da muss ich überlegen wie ich das Hinbekomme.
    Hab ein paar Fragen dazu:
    Muss es zu einem ViewModel auch immer ein Model geben? Oder würde jetzt wie in meinen Fall,
    ein ViewModel reichen um aus der Datenbank zu lesen?
    Ist nachher das ViewModel oder das Model für das Schreiben in die Datenbank zuständig?

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

    Hallo

    Es muss natürlich kein Model zu einem ViewModel geben. Wenn dein ViewModel nur Eigenschaften von Primitiven Datentyoen entjält benötigt es kein Model. Für die DB Operationen das ViewModel zuständig.

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

    Hab es soweit umgebaut und
    kann Jetzt das DatatGrid füllen.
    Schau bitte nochmal drüber.
    Die Sortierung im Datagrid ist sehr langsam.

    Wie komm ich jetzt an die SelectedItem der Listbox in mein ViewModel.
    Hatte mal was gelesen von Parameters oder so.
    Ich brauch das für mein Sql.
    Ich glaub jetzt wirds auch Zeit für InotifyProp.
    Kannst du mir mal etwas auf die Sprünge helfen?

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

    Sowohl was SelectedItem als auch was INotifyPropertyChanged betrifft guck mal in meine Tutorials. Gehe das Kapitel Binding durch und versuche besse Binding zu verstehen.
    Wenn du dann Fragen hast frag ruig.

    Dann sehen wir weiter bez. Der sortierung.

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

    Verstehe ich nicht, funzt bei mir alles.

    Im DataGrid werden alle Daten angezeigt und wenn ich einen Datensatz selektiere bekomme ich die TextBlöcke gefüllt.

    Wo genau liegt dein Problem??

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

    Die Textblöcke sind ja an das Datagrid (grdKunden) gebunden.

    XML-Quellcode

    1. <TextBlock Text="{Binding SelectedItem.Firma, ElementName=grdKunden}" Width="Auto"/>

    Ich möchte aber nicht den TextBlock an das DataGrid binden, sondern an die
    Eigenschaft (DtKunden) in der Bindingklasse direkt.

    So in der Art:

    XML-Quellcode

    1. <TextBlock Text="{Binding SelectedItem.Firma, ElementName=DtKunden}" Width="Auto"/>


    Es soll aber trotzdem der selektierte Datensatz im TextBlock
    angezeigt werden.Oder zumindest ein Zelle des selektierten Datensatzes.

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

    Ahh, ok. Das funzt aber so nicht.

    Die WPF ist nicht dafür gemacht das man direkt an ein DataTable bindet. Dir Fehlen da einige Mechanissmen.

    Die WPF ist gemacht um an ein oder mehrere ViewModel-Klassen zu binden.
    Es gibt Wege um an Daten eines DataTable direkt zu binden, aber dann kommen schon die nächsten Probleme wie z.b. die steuerung von SelectedItem usw.

    Ich habe dir mal ein Beispiel mit einer Klasse Kunde erstellt.
    Du kannst ja wenn du willst bei deinem DataTable bleiben. Dann aber mithilfe des DataTable die ObservableCollection von Kunden füllen.

    Edit: Aber das hat dir ErfinderDesRades eh auch schon vorgeschlagen.

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

    Genau das was ich wollte, Danke!
    Jetzt kann ich weitermachen :-).
    Ich bin natürlich nicht auf das Datatable fixiert,
    wäre auch für andere möglichkeiten offen.
    Mir geht es in erste Linie um die WPF/XAMl und das
    Binding erstamal.
    Ich bau das jetzt erstmal ein :thumbsup:
    Die Klasse Kunde ist jetzt ein Model nehm ich an?
    Danke und Gruß
    Amario
    In diese Konstellation ist es ein Model. Meine Empfehlung wäre aber INotifyPropertyChanged zu implementieren und somit ein ViewModel daraus zu machen.

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

    Hab jetzt versucht das ganze umzusetzen
    Es funktioniert zwar aber es fühlt sich echt träge an.
    Die Aktualisierung des DataGrid ist ziemlich träge.
    Bin nicht sicher, ob es an der Datatable liegt?
    Was auch komisch ist, das ich ohne Model auskomme.

    Das Datacontext in XAML wird unterkringelt
    (Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt).

    Kann man das so stehen lassen oder ist da noch was machbar
    für eine schnellere Aktualisierung der Datagrid?

    Edit: Hab es neu hochgeladen. Auf Win7 läuft es besser. :)

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

    Guten Morgen

    Nur so ne Frage am rande. Willst du nicht lernen? Du hast ja schon wieder direkt auf das DataTable gebunden.
    Da kommen wir zu dem entschluss das dies in der WPF nicht praktikabel ist und du machst es wieder. X/

    Amro schrieb:

    Es funktioniert zwar aber es fühlt sich echt träge an.

    Bei mir gehts super schnell. Ist aber wiederrum mit einem DataTable schwer zu sagen wo da der Flaschenhals wäre.

    Amro schrieb:

    Das Datacontext in XAML wird unterkringelt
    (Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt).

    Das liegt daran das du im Konstruktor (und der wird von der WPF durch setzen des DataContext im XAML aufgrufen) die Tabellen in die Liste lädst.

    VB.NET-Quellcode

    1. LadeTabellenListe()


    Das passiert natürlich auch zur Designzeit. Der Designer ruft auch den Konstruktor auf, nur wird der nicht fündig weil der die DB nicht kennt.
    Insofern musst du eben diesen Aufruf so umgestallten das er nur zur Laufzeit aufgerufen wird:

    VB.NET-Quellcode

    1. If Not DesignerProperties.GetIsInDesignMode(New DependencyObject) Then LadeTabellenListe()


    Grüße
    Sascha

    Edit: Da es nun definitiv mehr um WPF als um die DB geht verschiebe ich diesen Thread nun

    *verschoben* ~NoFear23m
    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:

    Nur so ne Frage am rande. Willst du nicht lernen?

    An was wird denn gebunden

    Amro schrieb:

    Ich bin natürlich nicht auf das Datatable fixiert,
    wäre auch für andere möglichkeiten offen.

    Das könnte jetzt der nächste Schritt sein zum Beispiel mit Observable collections oder was es da noch gibt.
    Will ich noch recherchieren ;)
    Die ListBox ist eine List(of..)
    Wie gesagt ich will erstmal ein Grundverständnis wie man überhaupt mal ein WPF Projekt aufbaut.
    Es bringt mir nix wenn überall von Commands , Inotify, Bindung und sonstiges
    geredet wird und ich nicht weiss wie man das richtig einsetzt.

    Ich denke auch das es bei vielen anderen auch so ist und dann
    schmeist man hin weil das einfach kein Fortschritt gibt.

    Ich wollte das Projekt eigentlich nach und nach
    Verbessern und Optimieren und das gelernte dann hier
    Stepweise einbauen bis ein einigermassen akzeptables
    Projekt ensteht. :)

    Ich bin dank deiner Hilfe für mich persönlich schon
    ein gutes Stück weiter gekommen denk ich.


    Gruss Amro