When you write
<Label name="myLabel" Content="{Binding Path=Name}" />
you are binding to myLabel.DataContext.Name
, and not myLabel.Name
.
The XAML in WPF is just a pretty user interface to display and interact with the actual data, otherwise known as the DataContext
. The purpose of other binding sources (RelativeSource
, ElementName
, etc) is to point to another property that doesn’t exist in the current control’s DataContext
So suppose you have a Window. Without setting the DataContext, the window still displays but there is no data behind it.
Now suppose to set myWindow.DataContext = new ClassA();
. Now the data that the window is displaying is ClassA
. If ClassA
has a property called Name
, I could write a label and bind it to Name
(such as your example), and whatever value is stored in ClassA.Name
would get displayed.
Now, suppose ClassA
has a property of ClassB
and both classes have a property called Name
. Here is a block of XAML which illustrates the purpose of the DataContext, and an example of how a control would refer to a property not in it’s own 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>
As you can see, the DataContext is based on whatever data is behind the UI object.
Update: I see this question so often from new WPF users that I expanded this answer into a post on my blog: What is this “DataContext” you speak of?