Just learning WPF databinding and have a gap in my understanding. I’ve seen a few similar questions on StackOverflow, but I’m still struggling in determining what I have done wrong.
I have a simple Person class with a Firstname and Surname property (standard CLR properties). I also have a standard CLR property on my Window class that exposes an instance of Person.
I’ve then got some XAML, with two methods of binding. The first works, the second doesn’t.
Can anybody help me to understand why the second method fails? There’s no binding error message in the Output log.
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}, Path=MyPerson}">
<StackPanel>
<Label>My Person</Label>
<WrapPanel>
<Label>First Name:</Label>
<Label Content="{Binding RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, Path=MyPerson.FirstName}"></Label>
</WrapPanel>
<WrapPanel>
<Label>Last Name:</Label>
<Label Content="{Binding MyPerson.Surname}"></Label>
</WrapPanel>
</StackPanel>
Edit: Ok, thanks so far. I’ve changed the second expression to:
<Label Content="{Binding Surname}"></Label>
I still can’t get it to work though!
Ok, I’ve discovered the problem here. New to WPF, so it took me a while to figure it out.
In the code behind I’m setting the MyPerson property after the call to InitializeComponent.
The first method I used works because the Window is initialised and the MyPerson property set by the time the label is initialised and it’s databinding expression evaluated.
The second method doesn’t work because the MyPerson property hasn’t been set when the Window and associated DataContext get initialised.
Simple when you know how!