WPF ListView mit 2 Spalten !=

  • C#

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Samus Aran.

    WPF ListView mit 2 Spalten !=

    Hay Com, ich bin es wider =)

    ich möchte klein Anfangen und nur eine Listview mit Material füllen.... doch die ListView ist unter WPF ganz anders Hand zu haben als bei einer Forms Anwendung.

    ich habe 2 Spalten "Seite" und "Passwort" doch ich kan im Code nicht listview1.columns ansprechen und auch nicht subitem.

    nun meine frage, wie muss ich es machen das ich die 2 strings in die listview schreiben kann?

    VB.NET-Quellcode

    1. #region Save
    2. private void btn_save_Click(object sender, RoutedEventArgs e)
    3. {
    4. if (((tb_seite.Text != "") && (tb_pass.Password != "") && (tb_passwdh.Password != "")))
    5. {
    6. if (tb_pass.Password != tb_passwdh.Password)
    7. {
    8. MessageBox.Show("Passwörter stimmen nicht überrein!");
    9. }
    10. else
    11. {
    12. string text = tb_seite.Text + "\t\t" + tb_pass.Password;
    13. string read_text = File.ReadAllText("pws.db");
    14. System.IO.File.WriteAllText("pws.db", read_text + "\r\n" + text);
    15. listview1.Items.Add(tb_seite.Text); //'das hier und in spalte 2 das tb_pass.Password
    16. tb_pass.Clear();
    17. tb_passwdh.Clear();
    18. tb_seite.Clear();
    19. }
    20. }
    21. else
    22. {
    23. MessageBox.Show("Bitte alle Felder ausfüllen!");
    24. }
    25. }
    26. #endregion


    mfg und Danke
    Du machst das in dem du die ItemSource des Listview auf eine List(Of T) setzt wobei T bei die z.B. eine eingene Klasse ist welche die Eigenschaft "Seite" und "Passwort" hat. Danach musst du nurnoch per Databinding die Eigenschaften an die Spalten binden.

    XML-Quellcode

    1. <ListView>
    2. <ListView.View>
    3. <GridView>
    4. <!--Seite im Attribut "DisplayMemberBinding" ist eine Eigenschaft deiner Klasse genauso wie Passwort-->
    5. <GridViewColumn Header="Seite" DisplayMemberBinding="{Binding Path=Seite}"/>
    6. <GridViewColumn Header="Passwort" DisplayMemberBinding="{Binding Path=Passwort}"/>
    7. </GridView>
    8. </ListView.View>
    9. </ListView>

    Mal ein beispiel wie der XAML-Code aussehen könnte.
    @Fire88:
    MVVM ist dir schon empfohlen worden.
    Insgesamt ist Wpf eine große Technologie, in die man sich sehr aufwändig einarbeiten muß.
    Da kann man jetzt einfach so weiter machen wie in WinForms, und bei jedem Prob dann im Forum nachfragen.
    Oder man investiert mal konzentriert Aufwand, um Wpf zu lernen

    ErfinderDesRades schrieb:

    @Fire88:
    MVVM ist dir schon empfohlen worden.
    Insgesamt ist Wpf eine große Technologie, in die man sich sehr aufwändig einarbeiten muß.
    Da kann man jetzt einfach so weiter machen wie in WinForms, und bei jedem Prob dann im Forum nachfragen.
    Oder man investiert mal konzentriert Aufwand, um Wpf zu lernen
    Hallo ErfinderDesRades

    Diese Zeit investiere ich auch, ich habe ein VISUAL C# Buch hier neben mir liegen welches ich immer als erstes zur Hand nehme.
    doch auch in dem Buch dünkt es mich das die Themen extrem mager gehalten sind.

    Buch: VISUAL C# 2010 Grundlagen und Profiwissen von Hanser ISBN: 978-3-446-42118-9

    Danke für den Link, ich werde diesen Durchlesen und hoffe darafu das ich dan etwas schlauer werde mit WPF.

    ich sehe gerade das es in dem Tut was du mir gepostet hast um Treeview geht, dies ist aber ganz anders von Aufbau her.

    mfg

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

    Tja, zu Wpf lernen habich auch nicht wirklich einen guten Buchvorschlag parat.

    Ich bin selbst völlig unsicher, wie's wohl am besten einzusteigen wäre. Weil Vorraussetzung scheint mir eine vollständige Beherrschung der Sprache, also inklusive Typsystem, Vererbung (inklusive static/nonstatic und die Deklarations-Scopes), Interfaces, Delegaten und Events.
    Außerdem muß Databinding verstanden sein, und mit Pattern gearbeitet werden, damit mittels MVVM die Daten vom Gui getrennt gehalten werden können.

    Das erscheint mir ein enormes Pensum, und ich frage mich, ob man bis hin zum Thema Databinding sich nicht besser über WinForms einarbeitet, auch wenn man WinForms später nie wieder anguckt.

    Also wo ich mich bei Konsole immer aufrege, nämlich dass da eine veraltete Vorgehensweise als "Vorstufe" eingeübt wird, während es sogar einfacher ist, gleich richtig mit WinForms einzusteigen, weißich bei Wpf garnicht, wie einsteigen, ohne die Krücke Winforms.
    Weil man muss ja eine Oberfläche programmieren können, sonst kannman programmieren ja nicht lernen.
    da bin ich voll deiner Meinung. ich habe leider noch nie mit dem Datenbindng gearbeitet, daher ist so was grade eine große Hürde.

    in WinForms wäre diese Tool was ich machen möchte innert 10 min geschrieben.... ich finde es nur sehr komisch das man bei WPF eig. eine ganz andere Programmierung hat als bei WinForms.

    Ich werde mich nochmals bei Video to Brain durchschauen und ein Paar tuts im Inet aufsuchen.

    Ich hoffe das dies noch kommt, da ich Wpf sehr gut finde da man nicht dermaßen eingeschränkt ist mit dem Design und Aufbau er Form.

    mfg
    WPF ist recht simpel wenn man einmal die Grundlagen gelesen hat.
    Ich kann zwei Bücher empfehlen: WPF von KThomas Claudius Huber und amazon.com/WPF-Control-Develop…Experiences/dp/0672330334

    Zu deinem Problem. Erstell ein ViewModel mit einer ObservableCollection, da diese Events besitzt welche die gebundenen Elemente über Änderungen informiert. ABER Achtung!! das ist nur in folgenden Fällen:
    • Ein Element der List wurde gelöscht
    • Ein Element wurde hinzugefügt
    • Ein Element wurde verschoben (index geändert)

    Wenn du jedoch eine ObservableCollection<Person> hast und Person hat einen Namen und ein Alter. Jetzt nehmen wir an irgendwo im Code ändert du das Alter einer Person wird das in z.B. einem DataGrid nicht aktualisiert. WIESO? Du musst bei Person IPropertyNotifyChanged implementieren und wenn das Alter geändert wird das Event feuern.

    Grundsätzlich würde ich dir wirklich sehr empfehlen von Codebehind wegzukommen. Ich selbst habe recht umfangreiche Applikaionen geschrieben welche praktisch keine einzige Zeile im Codebehind hatten.

    Wie soll ich dann Button_Click handeln? Nun ja man macht ein ViewModel und setzt dieses als DataContext. Nun erstellt man im ViewModel einen Command (ICommand) und bindet den Command an den Button.Command. Falls man wirklich mal sachen wie DragDrop braucht machst du dir ne AttachedProperty welche das ganze Zeug handelt und universell verwendbar ist.

    Fazit: Codebehind ist sinnlos. Mach am besten die ViewModel und die GUI's in nen extra Projekt (bitte keine neue Projektmappe!!). Das heißt das GUI ist in der Exe und die ViewModels in ner Dll. Dadurch stellst du sicher, dass du wirklich nicht auf das GUI aus dem ViewModel zugreifst (ist auf meinem Mist gewachsen hat sich aber gut bewährt). Zweiter Tipp (auch mein Mist) mach so ne Art LazzyLoad um die Ladegeschwindigkeiten zu steigern. Das heißt wenn du im ViewModel Properties hast diese erst erstellen wenn der Getter aufgerufen wird (ich würde den ?? - Operator verwenden). Dadurch werden Resourcen erst verbraucht wenn sie auch wirklich benötigt werden und die Performance geht rauf.

    Noch nen letzer Tipp. Falls du dich fragst wie du nun IsEnabled von Buttons usw. setzen kannst.
    Bei Buttons einfach die CanExecute Methode im verwenden (vom ICommand - im ViewModel).
    Bei allen anderen Controls: Binding!! Achtung wenn sich was ändert von z.b. der Property EnableGUI kannste einfach wieder das PropertyChanged Event für die Property feuern. Am besten einfach ne Basisklasse erstellen welche ne Methode hat welche ne Linq Expression entgegennimmt. Von dieser Expression dann den Namen des Members holen und somit haste das ganze PropertyChanged zeug schön gekappselt.

    Btw. nochwas die Bücher oben beschreiben KEIN MVVM!

    Aber wie bereits gesagt solange du dir kein MVVM aneignest wird das recht wenig...
    Du musst akzeptiern, dass in WPF kein Mensch mehr listbox1.Items.Add usw. macht.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

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

    thefiloe schrieb:

    Du musst akzeptiern, dass in WPF kein Mensch mehr listbox1.Items.Add usw. macht.
    Jap, nicht nur das man es nicht mehr macht, sondern auch das es nicht mehr geht unter WPF. =)

    Vielen dank für den Text, das Buch werde ich mir ansehen und auch eventuell bestellen wen ich mir bis heute Abend sicher bin das ich das will.

    Besten Dank euch allen.

    manuelle Daten

    @TheFilou

    "Du musst akzeptiern, dass in WPF kein Mensch mehr listbox1.Items.Add usw. macht."

    Was aber wenn die anzuzeigenden Einträge nicht ausschließlich direkt vorhanden sind, wenn man also die Daten entweder nur für die Anzeige verändern muß, z.B. Farben oder Muster oder Bilder oder Entsprechungen (Kennzeich = 1 -> angezeigt wird "gebuchte Rechnung"). Ich kann mir eine ganze Menge Möglichkeiten vorstelln, wo die vorhandenen Daten zur Anzeige ungeeignet sind und man aus diesem Grund doch wieder zum Listbox1.Items.Add zurückgreifen muss.

    ich kann mir nicht vorstellen, das man das mit Bindungen hinbekommt.

    Samus Aran schrieb:

    Natürlich kriegt man das mit Bindungen hin. In WPF wird Items.Add nicht mehr genutzt, get over it.


    Das interessiert mich jetzt wirklich. Ich mach das in WPF jetzt noch nicht soooo lange. Wie normale Datenbindings funktionieren ist mir schon ziemlich klar. Wie aber wenn z.B. in der Datenbank "Karomuster Gelb" steht, und ich ein Bildchen darstellen möchte ? Über Converter / Resourcen? Ich könnte die Info gebrauchen, sonst würd ich nicht fragen.