Разница между ItemsSource и DataContext в отношении ListBox - PullRequest
22 голосов
/ 03 июля 2010

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

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

1 Ответ

44 голосов
/ 06 июля 2010

Элементы управления (включая 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, - это то, как привязки к имени и фамилии могут работать.

...