views:

211

answers:

1

I'm trying to better understand Silverlights binding mechanism and so have created a simple program that will change the borderthickness of a listbox on the press of a button. However it doesn't work and I can't figure out what I am doing wrong. Any ideas?

XAML:

<Grid x:Name="LayoutRoot" Background="White">
    <ListBox Height="100" HorizontalAlignment="Left" Margin="134,102,0,0" Name="listBox1" VerticalAlignment="Top" Width="120" BorderThickness="{Binding TheThickness, Mode=TwoWay}" />
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="276,36,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>

Code:

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace SilverlightApplication4
{
    public partial class MainPage : UserControl
    {
        private TestClass testInst = new TestClass(); 

        public MainPage()

    {
        InitializeComponent();
        listBox1.DataContext = testInst;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        testInst.TheThickness = 10;
    }
}

public class TestClass
{
    private int theThickness = 5;

    public int TheThickness
    {
        get { return theThickness; }
        set
        {
            theThickness = value;

            NotifyPropertyChanged("TheThickness");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    // NotifyPropertyChanged will raise the PropertyChanged event, passing the source property that is being updated.
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

}

+1  A: 

A border thickness is of Type Thickness which has multiple values for Top, Bottom, Left and Right. The XAML parser knows how to handle something like BorderThickness="5" correctly but in code you need to use the Thickness type. For example:-

public Thickness SelectedThickness
{
 get { return (Thickness)GetValue(SelectedThicknessProperty); }
 set { SetValue(SelectedThicknessProperty, value); }
}

public static readonly DependencyProperty SelectedThicknessProperty =
 DependencyProperty.Register("SelectedThickness", typeof(Thickness), typeof(MyRectangle),
 new PropertyMetadata(new Thickness() { Top = 1, Bottom = 1, Left = 1, Right = 1 }));
}

In this case the default Thickness of 1.

Edit Code more like yours:-

    private Thickness theThickness = new Thickness() {Left = 5, Right = 5, Top = 5, Bottom = 5};

    public Thickness TheThickness
    {
        get { return theThickness; }
        set
        {
            theThickness = value;

            NotifyPropertyChanged("TheThickness");
        }
    }
AnthonyWJones
Thanks, I'm trying to get it to work now. The VS editor doesn't recognise where GetValue and SetValue come from though...
Calanus
Yes sorry I just cut'n'pasted a real example from some code I already had. The SetValue and GetValue stuff assumes the object is derived from a DependencyObject, you don't actually need them just replace your use of `int` with `Thickness` and replace your default value assignment. I'll tweak the answer.
AnthonyWJones
Thanks! You're a star!
Calanus