Различие между ItemsSource и DataContext, как принадлежит ListBox

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

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

22
задан AnthonyWJones 6 July 2010 в 14:51
поделиться

1 ответ

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

Предположим, у вас есть ListBox «myList» и MyData «myData». Тип MyData имеет свойство «Люди» типа ObservableCollection , а тип Человек , в свою очередь, имеет строковые свойства «Имя» и «Фамилия» .

Все перечисленные ниже варианты эквивалентны: -

 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 и Привязки к фамилии успевают заработать.

44
ответ дан 29 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: