我对 WPF 中的数据绑定仍然很陌生,所以我不确定数据上下文的目的应该是什么,只要你想改变它就可以通过设置 ItemsSource 属性来填写列表。
3 回答
值得注意的是,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 只是为特定框架元素(给定情况下的列表框)定义数据的上下文。在将控件上的任何属性绑定到数据时,如果未显式定义,则在 DataContext 中搜索源。因此,如果您绑定 ItemsSource 属性而不显式定义 Path,它将在列表框的 DataContext 中搜索 ItemsSource 属性的绑定源。
因此,在这种情况下,我们还需要 DataContext 来根据需要更改数据源,以便为整个控件的绑定获取数据。