什么是DataContext?

Eug*_*hok 33 data-binding wpf

作为将DataContext与WPF中的另一个属性链接的问题的延续.

在研究的最后,我非常惊讶地发现当一个人写这样的东西时:

<Label Content="{Binding Path=Name}" />
Run Code Online (Sandbox Code Playgroud)

DataContext其对Content性能的绑定是的Label控制本身!它仍然有效的事实是由于最近父级的DataContext值的默认继承.

但是,如果您将此标签包装在自定义控件中,并且您不希望将数据绑定到该DataContext控件的属性,那么您可能更喜欢:

<Controls:SearchSettings Settings="{Binding Path=Settings}" />
Run Code Online (Sandbox Code Playgroud)

你在这里.现在,你需要设置SettingsDataContextSearchSettings控制,对Label内部绑定反对,但你不能,因为这会触发重新绑定的Settings属性.

我看不到在使用不同来源的混合绑定属性点:DataContext通过ElementName等,那么,为什么我会永远使用DataContext

Rac*_*hel 93

当你写作

<Label name="myLabel" Content="{Binding Path=Name}" />
Run Code Online (Sandbox Code Playgroud)

你有约束力myLabel.DataContext.Name,而不是myLabel.Name.

WPF中的XAML只是一个漂亮的用户界面,可以显示实际数据并与之交互,也就是所谓的DataContext.其他绑定源(RelativeSource,ElementName等)的目的是指向当前控件中不存在的另一个属性DataContext


所以假设你有一个窗口.如果不设置DataContext,窗口仍会显示,但后面没有数据.

现在假设设置myWindow.DataContext = new ClassA();.现在窗口显示的数据是ClassA.如果ClassA有一个被调用的属性Name,我可以编写一个标签并将其绑定到Name(例如你的例子),并且ClassA.Name将显示存储的任何值.

现在,假设ClassA有一个属性,ClassB并且两个类都有一个名为的属性Name.这是一个XAML块,它说明了DataContext的用途,以及一个控件如何引用不属于它自己的DataContext的属性的示例

<Window x:Name="myWindow"> <!-- DataContext is set to ClassA -->
    <StackPanel> <!-- DataContext is set to ClassA -->

        <!-- DataContext is set to ClassA, so will display ClassA.Name -->
        <Label Content="{Binding Name}" />

         <!-- DataContext is still ClassA, however we are setting it to ClassA.ClassB -->
        <StackPanel DataContext="{Binding ClassB}">

            <!-- DataContext is set to ClassB, so will display ClassB.Name -->
            <Label Content="{Binding Name}" />

            <!-- DataContext is still ClassB, but we are binding to the Window's DataContext.Name which is ClassA.Name -->
            <Label Content="{Binding ElementName=myWindow, Path=DataContext.Name}" /> 
        </StackPanel>
    </StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

如您所见,DataContext基于UI对象后面的任何数据.

更新:我经常从新的WPF用户那里看到这个问题,我将这个答案扩展到我博客上的帖子中:你说的"DataContext"是什么?

  • @Eugene我强烈建议你研究一下MVVM设计模式.在我看来,它应该与任何WPF应用程序一起使用,您将更好地理解DataContext及其重要性.您的可视控件不是您的应用程序 - 您的DataContext(ViewModels).视觉控件(标签,按钮,文本框等)只是一个很好的UI,允许用户与您的应用程序进行交互. (5认同)