Warum funktioniert <TextBox Text=”{Binding Path=Data.[PropertyName]}”/> nicht wenn Data eine Collection nicht?
In WPF existieren zwei große Steuerelementgruppen, zum einem die Controls die Steuerelemente die eine Collection Visualisieren können, und die Steuerelemente die einzelnen Daten Visualisieren können.
Das ist auch der Grund warum dieser Einfache XAML Code funktioniert
<StackPanel>
<ListBox ItemsSource="{Binding}" SelectedValuePath="id" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=id}" />
<TextBox Text="{Binding Path=Name}"/>
</StackPanel>
</StackPanel>
Was macht diese XAML ausschnitt, die Antwort ist recht einfach: Mit Hilfe der ListView wird ein Element ausgewählt, und mit der TextBox kann der jeweilige Name verändert werden. Da man an dieser stelle in keinem der Controls eine Datenquelle definiert, wird die Datenquelle automatisch ausgewählt und passiert, an dieser Stelle nach einem ganz einfachen Prinzip:
Es wird der erste, im VisualTree darüber liegende DataContext benutzt, der definiert wurde.
Sobald die einzigste darüber liegende Datenquelle eine Collection ist passiert folgendes
Ist das Control selbst ein ItemsControl, wie ZB. eine ListView oder ComboBox wird die Collection selbst als VIew eingebunden, ist das Control selbst kein ItemsControl wird von der View das Property CurrentItem als DatenQuelle benutzt.
Die abschließende Frage ist nun.
Was kann man machen, um eine Spalte aus ZB. einer DataTable an eine TextBox zu binden?
Bevor man jetzt darüber nachdenkt, NEIN! im Hintergrund einfach CurrentItem des jeweiligen Views zu setzen, ist definitiv nicht die Lösung sein.
Der Weg ist aber nur ein kleinen wenig komplizierter, man muß halt den kompletten Pfad im Binding mit aufnehmen.
<TextBox Text="{Binding Path=Data.Rows[0][Name]}"/>
wobei Data an dieser Stelle das Property für die DataTable ist.