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