我不太了解ItemsSource和DataContext之间的区别。有人能解释一下并用例子来支持吗?我何时会使用其中一种。
我正在阅读文档,它说我可以使用DataContext进行绑定,但是我会在其中抛出一个ObservableCollection,并且列表中没有任何内容。如果我在ItemsSource中抛出相同的集合,它可以正常工作。
答案 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绑定管理工作的方式。