Binding en code C#22 avril 2010

General Code

Le Binding WPF en XAML est une écriture plutôt pratique qui permet, par exemple, de lier une ListBox à une collection d’objets, ou une propriété string à une TextBox pour en afficher le contenu.

Cette écriture a un équivalent en C#, qui vous permet de définir du Binding dynamique dans votre code.

Binding XAML

Pour vous présenter l’équivalence écriture XAML / écriture C#, je vais utiliser un exemple simple avec une TextBox bindée sur une propriété du ViewModel défini comme DataContext de la fenêtre.

ViewModel

class ViewModel : DependencyObject
{
    public string SampleText
    {
        get { return (string)GetValue(SampleTextProperty); }
        set { SetValue(SampleTextProperty, value); }
    }

    public static readonly DependencyProperty SampleTextProperty =
        DependencyProperty.Register("SampleText", typeof(string),
        typeof(ViewModel), new UIPropertyMetadata("Bonjour le monde !"));
}

XAML

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:WpfApplication1">
    <Window.DataContext>
        <my:ViewModel />
    </Window.DataContext>
    <Grid>
        <TextBox Text="{Binding SampleText}" />
    </Grid>
</Window>

Binding en code C#

Dans la partie XAML, plus besoin donc d’écrire l’expression de Binding sur la propriété Text, il suffit juste de nommer le contrôle:

<TextBox Name="MyBox" />

Utilisant le même ViewModel que l’exemple précédent, nous pouvons écrire ce code au niveau du constructeur de notre fenêtre:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        Binding bText = new Binding();
        bText.Path = new PropertyPath("SampleText");
        bText.Source = this.DataContext; // ou new ViewModel()

        MyBox.SetBinding(TextBox.TextProperty, bText);
    }
}

Lien MegaSnippets.com : WPF Binding in C#

Il y a d’autres propriétés de Binding comme le Mode (OneWay, TwoWay,…) et l’UpdateSourceTrigger qui peuvent être définies sur l’objet Binding (ici bText).

L’avantage de cette façon de faire est qu’il devient alors possible de spécifier un Binding de manière dynamique. Par exemple, vous pouvez vous Binder sur un élément spécifique d’un tableau en définissant l’indexeur de cette manière :

int i = 5;
bText.Path = new PropertyPath(string.Format("SampleArray[{0}]", i));