1

我对 WPF 中的数据绑定仍然很陌生,所以我不确定数据上下文的目的应该是什么,只要你想改变它就可以通过设置 ItemsSource 属性来填写列表。

4

3 回答 3

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>
于 2013-08-26T23:41:32.390 回答
1

因为 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>
于 2013-08-26T23:22:13.560 回答
0

顾名思义,DataContext 只是为特定框架元素(给定情况下的列表框)定义数据的上下文。在将控件上的任何属性绑定到数据时,如果未显式定义,则在 DataContext 中搜索源。因此,如果您绑定 ItemsSource 属性而不显式定义 Path,它将在列表框的 DataContext 中搜索 ItemsSource 属性的绑定源。

因此,在这种情况下,我们还需要 DataContext 来根据需要更改数据源,以便为整个控件的绑定获取数据。

于 2013-08-27T04:16:29.513 回答