• Le binding

    • Binding
    • Il s'agit du binding basique. Il est possible de récuperer la valeur de manière asynchrone en spécifiant la propriété IsAsync à "true". Il est également possible de lui assigner un converter afin de transformer la valeur d'entrée en valeur de sortie qui sera utilisée par la propriété du contrôle sur laquelle on applique le binding.

    • MultiBinding
    • Ce binding est très intéressant. Il offre de nouvelles perspectives. Il fait exactement la même chose que la classe Binding. Mais il permet de lier une propriété a plusieurs valeurs. L'utilisation d'un autre type de converter sera nécessaire.

    • PriorityBinding
    • Ce binding est très méconnu ... mais il offre de nouvelles possibilités d'interfaces. En effet, prenons l'exemple d'un affichages d'images dans une listbox. Le chargement des images prendra beaucoup de temps. Il est ainsi possible d'assigner des prioriétés. Par exemple, nous pouvons charger en premier les clés des images et les afficher dans la listbox et quand les images seront chargés ... il est possible d'afficher les images. Un autre exemple est visible dans la documentation du MSDN et montre l'afficharge du texte d'un texblock qui change en fonction du binding utilisé dans le "PriorityBinding".


  • La composite collection

  • La CompositeCollection offre de nouvelles possibilités au développement. En effet, il arrive parfois que l'on possède plusieurs sources de données,... qui envoient des objets à afficher dans un même controle (par exemple une grille). Jusqu'à présent, dans la plupart des cas, il fallait passer par une couche intermédiaire qui chargeait les objets des différentes sources et qui créait une collection contenant tous ces objets. Cela fonctionnait mais demandant pas mal de lignes de code. En WPF, tout cela se fait en quelques lignes. En effet, il est possible de n'avoir aucune ligne de c#/vb.... Comment ??? -> Simplement en écrivant quelques lignes de XAML. Pour faire simple, j'ai préféré faire un petit exemple pour expliquer comment fonctionne le CompositeCollection.

    Code XAML:
    [xml]
    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:src="clr-namespace:WpfApplication1"
        Title="Window1" Height="300" Width="300">
        <Window.Resources>
            <ObjectDataProvider x:Key="myDataSource" ObjectType="{x:Type src:Facade}"/>
            <ObjectDataProvider x:Key="myDataSource2" ObjectType="{x:Type src:Facade2}"/>
        </Window.Resources>
        <ListBox Name="listbox" DisplayMemberPath="Nom">
            <ListBox.ItemsSource>
                <CompositeCollection>
                    <CollectionContainer Collection="{Binding Source={StaticResource myDataSource2}, Path=Employes}"/>
                    <CollectionContainer Collection="{Binding Source={StaticResource myDataSource}, Path=Responsables}"/>
                    <CollectionContainer Collection="{Binding Source={StaticResource myDataSource}, Path=Directeurs}"/>
                </CompositeCollection>
            </ListBox.ItemsSource>
        </ListBox>
    </Window>
    
    Code C# pour les objets business:
    [csharp]
    public class Facade2
    {
        public List Employes
        {
            get
            {
                return m_employes;
            }
        }
    
        public Facade2()
        {
            m_employes = new List();
            m_employes.Add(new Employe("Patrick"));
            m_employes.Add(new Employe("Jean"));
        }
    
        private List m_employes;
    }
    
    public class Facade
    {
        public List Directeurs
        {
            get
            {
                return m_directeurs;
            }
        }
    
        public List Responsables
        {
            get
            {
                return m_responsables;
            }
        }
    
        public Facade()
        {
            m_responsables = new List();
            m_responsables.Add(new Responsable("Dirk"));
            m_responsables.Add(new Responsable("André"));
            m_directeurs = new List();
            m_directeurs.Add(new Directeur("Directeur"));
            m_directeurs.Add(new Directeur("Sous directeur"));
        }
    
        private List m_directeurs;
        private List m_responsables;
    }
    
    public class Responsable : Utilisateur
    {
        public override string Bidule
        {
            get { return "A"; }
        }
    
        public Responsable(string nom)
            : base(nom)
        { 
        }
    }
    
    public class Directeur : Utilisateur
    {
        public override string Bidule
        {
            get { return "B"; }
        }
    
        public Directeur(string nom)
            : base(nom)
        { 
        }
    }
    
    public class Employe : Utilisateur
    {
        public override string Bidule
        {
            get { return "C"; }
        }
    
        public Employe(string nom)
            : base(nom)
        { 
        }
    }
    
    public abstract class Utilisateur
    {
        public abstract string Bidule
        {
            get;
        }
    
        public string Nom
        {
            get
            {
                return m_nom;
            }
    
            set
            {
                m_nom = value;
            }
        }
    
        public Utilisateur(string nom)
        {
            m_nom = nom;
        }
    
        private string m_nom;
    }