tags:

views:

164

answers:

2

I'm trying to get the content of a label to bind to the string property of a class instance without much success.

XAML:

<Window x:Class="WPFBindingTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">    
<Grid>        
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" Content="{Binding Source=MyFoo, Path=W1}" VerticalAlignment="Top" />
    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" Content="{Binding Source=MyFoo, Path=W2}"  VerticalAlignment="Top" />
    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" Name="button1" VerticalAlignment="Bottom" Width="89" Click="button1_Click">Set Properties</Button>
</Grid>   

C#:

namespace WPFBindingTest
{
   public partial class Window1 : Window
    {
        public Foo MyFoo;

        public Window1()
        {
            InitializeComponent();            

            MyFoo = new Foo();           
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {      
            MyFoo.W1 = "Hello";
            MyFoo.W2 = "Dave";
        }
    }

    public class Foo
    {
        public string W1 { get; set; }
        public string W2 { get; set; }
    }
}

i.e. when I click the button, I set the properties of MyFoo to "Hello" and "Dave", and want that reflected in the labels on the UI. I've set the Content as a binding but something isn't right. What am I doing wrong here?

+2  A: 

You need to make your MyFoo a dependency property. See http://msdn.microsoft.com/en-us/library/ms752914.aspx for more details.

Moreover, you need to set the DataContext to your Window1 instance.

<Window DataContext={Binding RelativeSource={RelativeSource Self}} ...>

EDIT: Seems that making MyFoo a dependency property is not compulsory. However if you want the labels to pick up the changing values of W1 and W2, you need Foo to be either a DependencyObject, or implement interface INotifyPropertyChange.

Vlad
Thanks, this pointed me in the right direction. Made Foo implement INotifyPropertyChanged, then set the DataContext of Window1 to that of a BindingList<Foo>, which contains MyFoo. Label content is now:{Binding Path=W1, UpdateSourceTrigger=PropertyChanged}And it works a treat!
Gareth S
A: 

Or give your Window a name: like NameOfWindow and use a ElementName binding:

Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}"

Complete sample XAML:

<Window x:Class="WPFBindingTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" Name="NameOfWindow">    
<Grid>        
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" VerticalAlignment="Top" />
    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W2}"  VerticalAlignment="Top" />
    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" Name="button1" VerticalAlignment="Bottom" Width="89" Click="button1_Click">Set Properties</Button>
</Grid> 
Arcturus