我对WPF中的数据绑定还很陌生,所以我不确定数据上下文的用途是什么,当你可以随时通过设置ItemsSource属性来填充列表时。
值得注意的是,DataContext
不是ListBox
的属性,而是它继承的一个较低级别类,即FrameworkElement
的属性。换句话说,您在XAML中使用的几乎每种类型的视觉元素都会有一个DataContext——它是WPF类层次结构的一个函数。不过,您是对的,DataContext通常用于面板和其他包含直接内容的元素。它对不包含任何直接内容的控件没有那么有用(ListBox包含子控件,但它们的数据上下文是由控件单独设置的,因此它们不会直接继承ListBox的上下文)。
还要注意,设置ItemsSource
将设置一个值,而设置DataContext
将为对象及其视觉树子对象上的任何其他绑定建立一个新的参考点。在某些情况下,ItemsSource
可能不参与绑定,而是由静态资源设置:
<Grid>
<Grid.Resources>
<viewmodel:StringCollection x:Key="items">
<clr:String>Foo</clr:String>
<clr:String>Bar</clr:String>
</viewmodel:StringCollection>
</Grid.Resources>
<ListBox
ItemsSource="{StaticResource items}"
DataContext="{Binding MetaData}"
ToolTip="{Binding}" />
</Grid>
因为ListBox可能需要与它所属的父级不同的DataContext
示例:
<Grid DataContext="{Binding MainViewModel}">
<-- MainViewModel.Something
<TextBlock Text="{Binding Something}" />
<-- MainViewModel.ViewModel1.Items
<ListBox DataContext="{Binding ViewModel1}" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
<-- MainViewModel.Items
<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}"/>
</Grid>
DataContext只是定义特定框架元素(给定情况下为Listbox)的数据上下文。将控件上的任何属性绑定到数据时,如果未明确定义,则在DataContext中搜索源。因此,如果绑定ItemsSource属性而没有显式定义Path,它将在列表框的DataContext中搜索ItemsSource属性的绑定源。
因此,在这种情况下,我们还需要DataContext根据需求更改数据源,以便为整个控件的绑定获取数据。