Benutzer mit den meisten Antworten
INotifyPropertyChanged Erklährung

Frage
-
Hallo zusammen,
ich bin gerade dabei eine Produktliste zu Programmieren bei der man die Positionen einfach in ein DataGrid zufügen und dann am Schluss abspeichern kann, habe aber keine Ahnung wie. Anschliessend habe ich mal im Internet recherchiert und herausgefunden dass man ein InotifypropertyChanged einsetzten muss. Ich habe mir die MS-Erklährung bzw. Beispiele angeschaut, bin aber überhaupt nicht draus gekommen. Kann mir bitte jemand einfach erklären wie dies Funktioniert oder evtl. mir ein Idiotensicheres Tutorial empfehlen. Ich arbeite mit WPF Oberflächen.
Mfg Gezim95
Antworten
-
Hallo,
zunächst brauchst du eine Datenquelle für das DataGrid. Das kann eine Datenbankanbindung oder eine einfache Auflistung sein. Da du von INotifyPropertyChanged geschrieben hast, zielst du wohl auf eine Auflistung ab.Du brauchst also eine Liste im Codebehind:
public MainWindow(){ this.DataContext=this;//Damit im XAML die Eigenschaften im Codebehind gefunden werden this.Items = new ObservcableCollection<Item>(); InitialisizeComponent(); } public ObservableCollection<Item> Items{get;set;}
Eine ObservableCollection informiert die Ansicht automatisch, wenn ein Item hinzukommt/entfernt wird.
Nun brauchst du noch die Klasse Item:
public class Item : INotifyPropertyChanged { private int _ID; public int ID { get { return this._ID; } set { if (this._ID != value) { this._ID = value; this.OnPropertyChanged("ID"); } } } #region INotifyPropertyChanged Members protected void OnPropertyChanged(string propertyName) { var evt = this.PropertyChanged; if (evt != null) evt(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; #endregion }
Dort kommt nun auch die Schnittstelle ins Spiel. Du musst jede Eigenschaft so implementieren, wie ich es mit ID gezeigt habe. Wenn du dieser nun einen neuen Wert zuweißt, wird ebenfalls die Ansicht über diese Änderung informiert. Eine andere Aufgabe hat die Schnittstelle nicht.
Im XAML musst du nun lediglich ItemsSource des DataGrid festlegen:
<DataGrid ItemsSource="{Binding Items}"/>
So werden die Spalten automatisch generiert. Du kannst jedoch auch selbst verschiedene Spalten einfügen und festlegen welche Eigenschaft aus jedem Item-Element angezeigt werden soll:<DataGrid AutoGenerateColumns="False"> <DataGridTextColumn Binding="{Binding ID}"/> </DataGrid>
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert Gezim95 Samstag, 5. Juli 2014 17:51
Alle Antworten
-
Hallo,
zunächst brauchst du eine Datenquelle für das DataGrid. Das kann eine Datenbankanbindung oder eine einfache Auflistung sein. Da du von INotifyPropertyChanged geschrieben hast, zielst du wohl auf eine Auflistung ab.Du brauchst also eine Liste im Codebehind:
public MainWindow(){ this.DataContext=this;//Damit im XAML die Eigenschaften im Codebehind gefunden werden this.Items = new ObservcableCollection<Item>(); InitialisizeComponent(); } public ObservableCollection<Item> Items{get;set;}
Eine ObservableCollection informiert die Ansicht automatisch, wenn ein Item hinzukommt/entfernt wird.
Nun brauchst du noch die Klasse Item:
public class Item : INotifyPropertyChanged { private int _ID; public int ID { get { return this._ID; } set { if (this._ID != value) { this._ID = value; this.OnPropertyChanged("ID"); } } } #region INotifyPropertyChanged Members protected void OnPropertyChanged(string propertyName) { var evt = this.PropertyChanged; if (evt != null) evt(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; #endregion }
Dort kommt nun auch die Schnittstelle ins Spiel. Du musst jede Eigenschaft so implementieren, wie ich es mit ID gezeigt habe. Wenn du dieser nun einen neuen Wert zuweißt, wird ebenfalls die Ansicht über diese Änderung informiert. Eine andere Aufgabe hat die Schnittstelle nicht.
Im XAML musst du nun lediglich ItemsSource des DataGrid festlegen:
<DataGrid ItemsSource="{Binding Items}"/>
So werden die Spalten automatisch generiert. Du kannst jedoch auch selbst verschiedene Spalten einfügen und festlegen welche Eigenschaft aus jedem Item-Element angezeigt werden soll:<DataGrid AutoGenerateColumns="False"> <DataGridTextColumn Binding="{Binding ID}"/> </DataGrid>
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert Gezim95 Samstag, 5. Juli 2014 17:51
-
Ich resumiere einfach mal kurz was ein NotifyPropertyChanged macht:
Das NotifyPropertyChanged sendet einfach ein Event wenn sich der Inhalt einer Variable ändert. Die Oberfläche bekommt das event und liest den wert neu aus.
Ansonsten siehe Tom.
Die ObservableCollection sendet das Change event sobald sich ein item seiner collection ändert.