ItemsSource和DataContext之间的区别与ListBox有关

时间:2010-07-02 21:36:34

标签: silverlight silverlight-4.0 datacontext itemssource

我不太了解ItemsSource和DataContext之间的区别。有人能解释一下并用例子来支持吗?我何时会使用其中一种。

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

1 个答案:

答案 0 :(得分:44)

控件(包括ListBox)根本不对DataContext的值执行任何操作。其目的是为数据绑定提供上下文。

假设您有一个ListBox“myList”和一个MyData“myData”。 MyData类型具有类型为ObservableCollection<Person>的属性“People”,而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>

你会在这里注意几件事。根本没有分配“myList”的DataContext。在这种情况下,控件的祖先树将被遍历,直到找到具有分配给DataContext属性的值的祖先。

为每个ListBoxItem实例动态生成的每个Person都将Person实例指定为其DataContext,这是Forename和Surname绑定管理工作的方式。