Элементы управления (включая ListBox) вообще ничего не делают со значением DataContext
.Его цель - предоставить контекст для привязок данных .
Предположим, у вас есть ListBox
"myList" и MyData
"myData".Тип MyData
имеет свойство «People» типа ObservableCollection<Person>
, а тип Person
, в свою очередь, имеет строковые свойства «Имя» и «Фамилия».
Все следующие параметры эквивалентны: -
myList.ItemsSource = myData.People;
или
myList.DataContext = myData;
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("People"));
или
myList.DataContext = myData.People;
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding());
Обычно привязки настраиваются в Xaml и DataContext из LayoutRoot назначается объекту данных: -
LayoutRoot.DataContext = myData;
у вас может быть следующий Xaml: -
<Grid x:Name="LayoutRoot">
<ListBox x:Name="myList" ItemsSource="{Binding People}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Forename}" Margin="2" />
<TextBlock Text="{Binding Surname}" Margin="2" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
Здесь вы заметите пару вещей.DataContext
из «myList» вообще не назначен.В этом случае дерево предков элемента управления обходится до тех пор, пока не будет найден предок, которому присвоено свойство DataContext
.
Также каждый ListBoxItem
, динамически генерируемый для каждого экземпляра Person
, имеет Person
экземпляр, назначенный в качестве DataContext
, - это то, как привязки к имени и фамилии могут работать.