当您可以只为其提供 ItemsSource 时,在列表框上设置 DataContext 的价值是什么?



我对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根据需求更改数据源,以便为整个控件的绑定获取数据。

最新更新