Autor Beitrag
shamanu
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.07.10 10:31 
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
ausblenden volle Höhe C#-Quelltext
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(thisnew PropertyChangedEventArgs(name));
            }

            #endregion
        }


Ein Kontainer soll nun die vorherige Klasse halten
ausblenden C#-Quelltext
1:
2:
3:
4:
        public class TestContainer
        {
            public Element Value { get; set; }
        }


Zum Anzeigen habe ich testweise im code-behind:
ausblenden 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:
ausblenden 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 user profile iconChristian S.: C#- durch XML-Tags ersetzt
wpf chris
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 01.03.11 17:27 
hi ich hatte das gleich problem beim binden an einen XmlDataProvider. ohne die datatemplates für die zellen hat es funktioniert. also anstatt einer DataGridTemplateColumn eine DataGridTextColumn verwenden. und so wie es scheint machst du mit der TextBox in deinem template nichts anderes als die TextColumn.