Laden...

Databind ObservableCollection Datagrid (WPF / MVVM)

Erstellt von Moritz83 vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.482 Views
M
Moritz83 Themenstarter:in
50 Beiträge seit 2013
vor 4 Jahren
Databind ObservableCollection Datagrid (WPF / MVVM)

Moin,

ich versuche im Moment mich in C# und MVVM einzuarbeiten, allerdings scheitere ich am Databinding. Hoffe jemand hat Lust und Zeit mir kurz unter die Arme zu greifen, wäre echt dankbar!

Die Idee ist (wie hier angesprochen -> SQLite (Mehrere User updaten denselben Eintrag - Was passiert?)) aus einer SQLite Datei Name und Vorname auszulesen und in einem Datagrid darzustellen. Habe den Code von Code-Behind auf MVVM (oder zumindest im Ansatz) umgebaut aber nun bleibt mein Datagrid leer. Da die FOR Schleife im ViewModel allerdings Daten ausspuckt gehe ich davon aus, das etwas mit der Rückmeldung an die View nicht passt (inotifypropertychanged fehlt noch komplett, damit stehe ich noch auf Kriegsfuss).

Was ich bis jetzt habe:

Mitarbeiter.cs (Model)

namespace SQLite.Models
{
    public class Mitarbeiter
    {
        public Mitarbeiter(string vorname, string nachname)
        {
            Vorname = vorname;
            Nachname = nachname;
        }

        public string Vorname { get; set; }
        public string Nachname { get; set; }
    }
}

MainWindowViewModel.cs (ViewModel)

using System;
using System.Collections.ObjectModel;
using System.Data.SQLite;
using SQLite.Models;

namespace SQLite.ViewModels
{
    class MainWindowViewModel
    {
        public ObservableCollection<Mitarbeiter> Test;

        public MainWindowViewModel ()
        {
            FetchData();
        }

        void FetchData()
        {
            string connectionString = "Data Source=C:\\Users\\Moritz\\Desktop\\Test.db" + ";Version=3;";
            SQLiteConnection connection = new SQLiteConnection(connectionString);
            SQLiteCommand cmd = new SQLiteCommand("select * from Mitarbeiter", connection);
            Test = new ObservableCollection<Mitarbeiter>();
            connection.Open();          
            SQLiteDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                string Vorname = reader.GetString(1);
                string Nachname = reader.GetString(2);
                Test.Add(new Mitarbeiter(Vorname, Nachname));
            }

            //TEST
            for (int i = 0; i < Test.Count; i++)
            {
                Console.WriteLine(string.Concat(Test[i].Vorname, "---", Test[i].Nachname));
            }
            //TEST
        }
    }
}

MainWindow.xaml.cs (View)

using System.Windows;
using SQLite.ViewModels;

namespace SQLite.Views
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainWindowViewModel();

            ///////////////////LÖSCHEN
            //string connectionString = "Data Source=C:\\Users\\Moritz\\Desktop\\Test.db" + ";Version=3;";
            //SQLiteConnection connection = new SQLiteConnection(connectionString);
            //SQLiteCommand cmd = new SQLiteCommand("select * from Mitarbeiter", connection);
            //ObservableCollection<Mitarbeiter> Test = new ObservableCollection<Mitarbeiter>();
            //connection.Open();
            //SQLiteDataReader reader = cmd.ExecuteReader();
            //while (reader.Read())
            //{
            //    string Vorname = reader.GetString(1);
            //    string Nachname = reader.GetString(2);
            //    Test.Add(new Mitarbeiter(Vorname, Nachname));
            //}
            //dt1.ItemsSource = Test;
            ///////////////////LÖSCHEN

        }
    }
}

MainWindow.xaml (View)

<Window x:Class="SQLite.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Grid>
        <DataGrid ItemsSource="{Binding Test}" AutoGenerateColumns="True" Name="dt1" HorizontalAlignment="Left" Height="235" Margin="59,60,0,0" VerticalAlignment="Top" Width="663"/>
    </Grid>

</Window>

Ich weiss das der Code alles andere als "ideal" ist (using für die SQLite Connection fehlt, etc) aber ich wollte Step By Step vorgehen um dafür das Ganze besser zu verstehen. Normalerweise frage ich nicht nach "Gesamtlösungen" aber ich probiere hier seit Stunden rum und vermute das ich einen fatalen Denkfehler mache.

4.931 Beiträge seit 2008
vor 4 Jahren

Beim DataBinding müssen Eigenschaften (properties), anstatt Membervariablen verwendet werden, also:


public ObservableCollection<Mitarbeiter> Test { get; /*private*/ set; }

Bei DataBinding-Problemen immer auch im VS-Log ("Ausgabe Fenster") nachschauen (in den Optionen gibt es eine Einstellung, was alles genau protokolliert wird). Überprüfe also ersteinmal, ob und was dir genau (zur Laufzeit während des Debuggens) ausgegeben wird, damit du weißt, wonach du mal bei weiteren Problemen schauen mußt.

M
Moritz83 Themenstarter:in
50 Beiträge seit 2013
vor 4 Jahren

X( au weia, habs ja gesagt .... den Wald vor lauter Bäumen nicht mehr sehen.

Danke dir, klappt alles wunderbar!