Click here to Skip to main content
15,883,749 members
Articles / Programming Languages / C#

Updating Source on PropertyChanged on Silverlight

Rate me:
Please Sign up or sign in to vote.
4.89/5 (13 votes)
6 Jul 2010CPOL1 min read 36.5K   266   11   13
A simple dependency property that allows you to update a property on PropertyChanged.

Introduction

Don't you miss the "UpdateSourceTrigger=PropertyChanged" on a Binding expression on Silverlight? Well, me too, and since I don't like the idea of having a hidden control to change focus on every TextChange of my TextBoxes, I tried to make a more elegant solution for the problem.

Background

In both WPF and Silverlight, when we create a BindingExpression, you can define a UpdateSourceTrigger property of the Binding. But, there is a huge difference between them, Silverlight has only the Default mode (LostFocus) and Explicit, so we are missing PropertyChanged that in some cases makes our life way easier.

Using the Code

The code is fairly simple. It is only one AttachedProperty that will handle the TextChanged for you and will update the BindingSource if the BindingExpression of the TextProperty exists.

This was only implemented in the TextBox because there is no need to change the other input controls over the fact that LostFocus works perfect for them (like ComboBoxes, CheckBoxes, RadioButtons).

So, we define an AttachedProperty that shouldn't be a problem to any Silverlight developer:

C#
public static bool GetUpdateOnPropertyChanged(DependencyObject obj)
{
    return (bool)obj.GetValue(UpdateOnPropertyChangedProperty);
}

public static void SetUpdateOnPropertyChanged(DependencyObject obj, bool value)
{
    obj.SetValue(UpdateOnPropertyChangedProperty, value);
}

public static readonly DependencyProperty UpdateOnPropertyChangedProperty =
    DependencyProperty.RegisterAttached(
        "UpdateOnPropertyChanged",
        typeof(bool),
        typeof(UpdateSourceManager),
        new PropertyMetadata(
            new PropertyChangedCallback(
                UpdateOnPropertyChangedPropertyCallback)));

Then we define the UpdateOnPropertyChangedPropertyCallback:

C#
static void UpdateOnPropertyChangedPropertyCallback(
    DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    if (sender is TextBox)
    {
        TextBox txt = sender as TextBox;
        txt.TextChanged += new TextChangedEventHandler(txt_TextChanged);
    }
}

static void txt_TextChanged(object sender, TextChangedEventArgs e)
{
    TextBox txt = sender as TextBox;

    var bindingExpression = txt.GetBindingExpression(TextBox.TextProperty);
    if (bindingExpression != null)
    {
        bindingExpression.UpdateSource();
    }
}

Then, for using this, just add to your UserControl the proper XML namespace like:

XML
<UserControl x:class="UpdateSourceTrigger.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:UpdateSourceTrigger" 
    mc:ignorable="d">

And finally, add the Attached Property to the TextBox as follows:

XML
<TextBox 
    Text="{Binding Context.FirstName, Mode=TwoWay}" 
    Grid.Column="1" 
    Grid.Row="0" 
    Margin="5" 
    local:UpdateSourceManager.UpdateOnPropertyChanged="True"
    />

The End

Hope this can make things easier to you, as it did to me.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
Brazil Brazil
Senior Software Architect from Brazil.

Comments and Discussions

 
QuestionUpdateSourceManager weird bug on a deployed View Pin
Mycroft Holmes28-Aug-12 14:54
professionalMycroft Holmes28-Aug-12 14:54 
GeneralMy vote of 4 Pin
Albert van Peppen27-Jul-12 0:11
professionalAlbert van Peppen27-Jul-12 0:11 
GeneralMy vote of 5 Pin
Mycroft Holmes12-Jul-12 18:19
professionalMycroft Holmes12-Jul-12 18:19 
SuggestionCan add a notifier dynamically Pin
Christophe Bertrand16-Nov-11 22:52
Christophe Bertrand16-Nov-11 22:52 
GeneralMy vote of 5 Pin
Duke Carey18-May-11 2:29
professionalDuke Carey18-May-11 2:29 
GeneralGreat! Pin
Marcelo Ricardo de Oliveira12-Jul-10 6:57
Marcelo Ricardo de Oliveira12-Jul-10 6:57 
GeneralRe: Great! Pin
Raul Mainardi Neto12-Jul-10 7:01
Raul Mainardi Neto12-Jul-10 7:01 
GeneralCool Pin
Alan Beasley8-Jul-10 22:16
Alan Beasley8-Jul-10 22:16 
GeneralRe: Cool Pin
Raul Mainardi Neto9-Jul-10 15:14
Raul Mainardi Neto9-Jul-10 15:14 
GeneralCool, makes sense to me. SL really is limited Pin
Sacha Barber8-Jul-10 4:51
Sacha Barber8-Jul-10 4:51 
GeneralRe: Cool, makes sense to me. SL really is limited Pin
Raul Mainardi Neto8-Jul-10 5:01
Raul Mainardi Neto8-Jul-10 5:01 
GeneralRe: Cool, makes sense to me. SL really is limited Pin
Alan Beasley8-Jul-10 22:12
Alan Beasley8-Jul-10 22:12 
GeneralRe: Cool, makes sense to me. SL really is limited Pin
Sacha Barber8-Jul-10 23:01
Sacha Barber8-Jul-10 23:01 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.