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

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

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

1 ответов


элементы управления (включая список) ничего не делают со значением DataContext на всех. Его цель - предоставить контекст для data привязки.

предположим, у вас есть ListBox "myList" и A MyData "myData". The MyData тип имеет свойство "люди" типа ObservableCollection<Person> и в свою очередь Person type имеет строковые свойства "Forename"и " фамилия".

все следующие эквивалент:-

 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>

здесь вы заметите пару вещей. The DataContext "myList" не назначается вообще. В этом случае дерево предков элемента управления перемещается до тех пор, пока не будет найден предок, который имеет значение, присвоенное DataContext собственность.

тоже друг ListBoxItem динамически генерируется для каждого Person инстанции, что Person экземпляр, назначенный как его DataContext именно так работают привязки имени и фамилии.