Hallo,
Ich versuche ein eigentlich einfaches Binding zwischen einem DataGrid und einer ObservableCollection zu erstellen, verstehe jedoch nicht so recht wiso die Daten zwar gelesen und richtig angezeigt werden, jedoch die Änderungen nicht gesetzt werden.
Hier eine vereinfachtes Testbeispiel:
Eine Klasse hält einen Text
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| public class Element : INotifyPropertyChanged { private string _Text; public string Text { get { return _Text; } set { _Text = value; NotifyPropertyChanged("Text"); } }
public Element(string text) { _Text = text; }
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string name) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(name)); }
#endregion } |
Ein Kontainer soll nun die vorherige Klasse halten
C#-Quelltext
1: 2: 3: 4:
| public class TestContainer { public Element Value { get; set; } } |
Zum Anzeigen habe ich testweise im code-behind:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private ObservableCollection<TestContainer> TestList;
public MainWindow() { TestList = new ObservableCollection<TestContainer>(); Element testElement = new Element("def"); TestList.Add(new TestContainer() { Value = testElement });
DataContext = this; InitializeComponent(); } |
Und im Xaml binde ich einfach auf die ObservableCollection:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| <DataGrid x:Name="dgrContent" AutoGenerateColumns="False" ItemsSource="{Binding TestList}"> <DataGrid.Columns> <DataGridTemplateColumn Header="Value"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding Value.Text, Mode=TwoWay}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> |
Die Daten werden nun in der TextBox korrekt angezeigt aber wenn ich sie ändere wird in der Klasse Element das property Text nie gesetzt, auch nicht wenn ich die TextBox wechsle.
Moderiert von
Christian S.: C#- durch XML-Tags ersetzt