Ответ 1
Элементы управления (включая ListBox) ничего не делают со значением DataContext
. Его цель - предоставить контекст для привязки данных .
Предположим, что у вас есть ListBox
"myList" и MyData
"myData". Тип MyData
имеет свойство "Люди" типа ObservableCollection<Person>
и, в свою очередь, тип Person
имеет свойства строки "Forename" и "Surname".
Все следующие эквиваленты: -
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
, который управляет работами с именами Forename и Surname.