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

Ang*_*ker 22 silverlight datacontext itemssource silverlight-4.0

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

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

Ant*_*nes 44

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

让我们假设你有一个ListBox"myList"和一个MyData"myData".该MyData类型具有类型的属性"People",ObservableCollection<Person>Person类型具有字符串属性"Forename"和"Surname".

以下所有内容均相同: -

 myList.ItemsSource = myData.People;
Run Code Online (Sandbox Code Playgroud)

要么

 myList.DataContext = myData;
 myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("People"));
Run Code Online (Sandbox Code Playgroud)

要么

 myList.DataContext = myData.People;
 myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding());
Run Code Online (Sandbox Code Playgroud)

通常,虽然在Xaml中配置了绑定,但为LayoutRoot的DataContext分配了数据对象: -

 LayoutRoot.DataContext = myData;
Run Code Online (Sandbox Code Playgroud)

你可能有以下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>
Run Code Online (Sandbox Code Playgroud)

你会在这里注意几件事.该DataContext"myList中"是不是在所有分配.在这种情况下,控件的祖先树将被移动,直到找到具有分配给DataContext属性的值的祖先.

此外,ListBoxItem为每个Person实例动态生成的每个实例都将该Person实例指定为其实例DataContext,即Forename和Surname绑定的工作方式.

  • 非常感谢你.这是我发现的第一个可以理解的解释. (5认同)