22

我不太了解 ItemsSource 和 DataContext 之间的区别。有人可以解释它并用例子支持它吗?我什么时候会使用其中一个。

我正在阅读文档,它说我可以使用 DataContext 进行绑定,但是我向它抛出了一个 ObservableCollection 并且列表中没有显示任何内容。如果我在 ItemsSource 中抛出相同的集合,它可以正常工作。

4

1 回答 1

45

控件(包括 ListBox)根本不使用 的值做任何事情DataContext。其目的是为数据绑定提供上下文。

假设您有一个ListBox“myList”和一个MyData“myData”。该MyData类型具有类型的属性“People”,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 中配置了绑定,并且为 LayoutRoot 的 DataContext 分配了数据对象:-

 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 绑定的工作方式。

于 2010-07-06T14:51:45.950 回答