Подтвердить что ты не робот

Разница между ItemsSource и DataContext, относящаяся к ListBox

Я не очень разбираюсь в различиях между ItemsSource и DataContext. Может ли кто-нибудь объяснить это и поддержать его примерами? Когда я буду использовать один или другой.

Я читаю документы, и он говорит, что я могу привязываться с использованием DataContext, но я бросаю ObservableCollection на него и ничего не отображается в списке. Если я бросаю одну и ту же коллекцию в ItemsSource, она отлично работает.

4b9b3361

Ответ 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.