当你写作时
<Label name="myLabel" Content="{Binding Path=Name}" />
您绑定到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>
如您所见,DataContext 基于 UI 对象背后的任何数据。
更新:我经常从新 WPF 用户那里看到这个问题,因此我将这个答案扩展到我的博客上的一篇文章中:What is this “DataContext” you speak of?