Hallo, ich versuche gerade in einem DataGrid Daten zu verwalten. Ich finde jedoch das WPF Datagrid sehr kompliziert im Umgang. Ich möchte in einem Fenster das Grid haben und nach dem Schließen des Fensters sollen die Veränderten Daten ausgelesen werden können; ich weiß jedoch nicht wie das gehen soll, da ich im Internet immer nur TUTs mit fest definierten Daten fand. Die Daten werden als List<T> am Konstruktor des Fensters an dieses übergeben und sollen über ein Property abgerufen werden können. Das XAML sieht ungefähr so aus:
/// <summary> /// Gibt das Geschlecht der Lehrer an. /// </summary> [DataContract([...])] public enum Lehrer_Geschlechter { /// <summary> /// Gibt an, dass es sich um einen Mann handelt. /// </summary> Mann = 1, /// <summary> /// Gibt an, dass es sich um eine Frau handelt. /// </summary> Frau = 2 }
Die struct so:
/// <summary> /// Repräsentiert einen Lehrer. /// </summary> [DataContract([...])] public struct Lehrer { /// <summary> /// Der Nachname des Lehrers. /// </summary> [DataMember(IsRequired = true)] public string Name { get; set; }
/// <summary> /// Der Vorname des Lehrers. /// </summary> [DataMember(IsRequired = true)] public string Vorname { get; set; }
/// <summary> /// Das Kürzel des Lehrers. /// </summary> [DataMember(IsRequired = true)] public string Kuerzel { get; set; }
/// <summary> /// Gibt Titel an, die der Lehrer besitzt. /// </summary> [DataMember(IsRequired = true)] public string Titel { get; set; }
/// <summary> /// Das Geschlecht des Lehrers. /// </summary> [DataMember(IsRequired = true)] public Lehrer_Geschlechter Geschlecht { get; set; }
/// <summary> /// Instanziert einen neuen Wertetyp der "Lehrer"-Struktur. /// </summary> /// <param name="pName">Der Nachname des Lehrers.</param> /// <param name="pVorname">Der Vorname des Lehrers.</param> /// <param name="pKuerzel">Das Kürzel des Lehrers.</param> /// <param name="pGeschlecht">Das Geschlecht des Lehrers.</param> /// <param name="pTitel">Gibt Titel an, die der Lehrer besitzt.</param> public Lehrer(string pName, string pVorname, string pKuerzel, Lehrer_Geschlechter pGeschlecht, string pTitel) { this = new Lehrer() { Kuerzel = pKuerzel, Geschlecht = pGeschlecht, Vorname = pVorname, Name = pName, Titel = pTitel }; } }
Das Fenster so:
public partial class LURManagingWindow : Window { public LURManagingWindow(List<Lehrer> pLehrerList) { InitializeComponent();
this.dgLehrer.ItemsSource = /* ??? */; }
/// <summary> /// Verwaltet alle vom Benutzer hinzugefügten Lehrer. Sie werden von außen abgerufen. /// </summary> public List<Lehrer> LehrerList { get; private set; } }
Wo weist Du denn den DataContext zu? Und ist das dann die List<T>, von der Du sprichst? Oder hast Du ein ViewModel, weil Du sagst: "Die Daten werden als List<T> am Konstruktor übergeben und sollen über ein Property abgerufen werden können."? Welcher Konstruktor?
Wieso oft führen auch hier verschiedene Wege nach Rom. Du solltest Dich eher früher als später mal mit MVVM und Data Binding befassen. Außerdem gibt es einen sehr ausführlichen (aber auch anspruchsvollen und leider schon etwas älteren) Artikel zum DataGrid bei Code Project. Ich habe den Link gleich auf die Stelle gesetzt, wo es (nach der Einleitung) interssant wird, denn der Teil mit DataTable wirkt auf mich etwas angestaubt.
So, nun aber zu einer konkreten Lösung. Du solltest als ItemsSource eine ObservableCollection verwenden. Hier wurde schon mal die Frage beantwortet, wie man das mit dem DataGrid macht. Du solltest Dir außerdem diese ObservableCollection in Deiner Window-Klasse merken. Wenn das Fenster dann zugemacht wird, kannst Du dieses Event abfangen und dann auf die Collection zugreifen. Du solltest dann darin die geänderten Werte vorfinden.