20janv. 2010

Silverlight : déclaration d'un binding en CSharp

Voici deux utilisation du DataBinding dans Silverlight.

La première est un Binding simple d'une propriété sur un champ Text, la deuxième est effectuée sur un fichier resource.

Binding dans un control

Petit mémo sur les méthodes de création de binding. Ici on crée un binding sur la propriété Title d'un objet. Le type de l'objet ne nous interesse pas. A noter qu'il convient d'utiliser la classe System.Windows.Data.Binding.

En CSharp :

TextBlock textBlock = new TextBlock();
textBlock.SetBinding(TextBlock.TextProperty, 
    new System.Windows.Data.Binding("Title"));

En XAML :

<TextBlock  Text="{Binding Title}"/>

Binding sur un fichier ressource

Le binding direct sur un fichier ressource n'est pas supporté. On rencontre un problème de portée avec les fichiers ressources qui sont internal. Les passer en public n'a pas fonctionné pour moi.

La solution est de créer une classe qui contiendra les singletons des fichiers ressources en question :

 
namespace Demo.Resource.Container;

public class ContainerResource {
    private static MyResource _resource 
        = new MyResource();

    public static MyResource ResourceProp {
        get { return _resource; }
}

Reste ensuite a référencer la classe dans le UserControl où vous souhaitez utiliser les valeurs :

<UserControl x:Class="Demo.Resource.HelloWorld"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:res="Demo.Resource.Container">

Le namespace de la classe est ajouté dans le control. On ajoute ensuite une entrée dans la balise UserControl.Resources du control :

<UserControl.Resources>
    <res: ContainerResource x:Name="libelle"/>
</UserControl.Resources>

A partir de maintenant il nous est possible d'accèder aux membres de la classe ContainerResource. Voici le code XAML :

<TextBlock Text="{Binding Path= ResourceProp .PAGE_TITLE, Source={StaticResource libelle}}"/>

En espérant que ça puisse aider ;).