myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- GUI: WPF und XAML (https://www.mycsharp.de/wbb2/board.php?boardid=85)
--- Databind ObservableCollection Datagrid (WPF / MVVM) (https://www.mycsharp.de/wbb2/thread.php?threadid=121781)


Geschrieben von Moritz83 am 13.04.2019 um 09:11:
  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)

C#-Code:
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)

C#-Code:
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)

C#-Code:
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)

C#-Code:
<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.


Geschrieben von Th69 am 13.04.2019 um 09:22:
 
Beim DataBinding müssen Eigenschaften (properties), anstatt Membervariablen verwendet werden, also:

C#-Code:
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.


Geschrieben von Moritz83 am 13.04.2019 um 09:48:
 
enttäuscht au weia, habs ja gesagt .... den Wald vor lauter Bäumen nicht mehr sehen.

Danke dir, klappt alles wunderbar!


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 10.12.2019 04:28