Archive

Posts Tagged ‘MultiBinding’

Faire du MutliBinding sans utiliser la classe MutliValueConverter, c’est possible !

J’ai longtemps cru qu’il était impossible de faire du MultiBinding sans disposer au préalable d’un converter c’est à dire d’une instance d’une classe dérivant de la classe de base MultiValueConverter.
Il n’y a qu’à voir cette discussion où je mettais à défi les membres du forum pour me sortir un exemple de cas d’utilisation où l’instance d’un MutliValueConverter ne serait pas indispensable.
Le fait que j’ai lancé ce défi était dû à deux choses :

  1. La première est liée au fonctionnement même du MultiBinding. Ce dernier recevant plusieurs bindings en paramètre alors il doit savoir comment les afficher donc on avait besoin d’une classe dérivant de la classe de base MutliValueConverter pour combiner ces différents bindings et fournir un résultat final.
  2. Quand on oublie de spécifier un converter dans le MutliBinding, nous remarquons le message « Impossible de définir MutliBinding parce que MutliValueConverter doit être spécifié » nous est renvoyé pas Visual Studio.

Bon ! Après des recherches sur le net, j’en suis arrivé à la conclusion suivante : il est bien possible de faire du MultiBinding sans utiliser une classe dérivant de la classe MutliValueConverter. Il suffit d’utiliser la propriété StringFormat de l’instancce de notre MultiBinding..

Comme on le dit souvent du code vaut mieux qu’un long discours alors voici un exemple de cas d’utilisation très simple :

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
 
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
 
        <ComboBox x:Name="cb1" Grid.Column="0" Margin="2">
            <ListBoxItem Content="Item 0 - 1" />
            <ListBoxItem Content="Item 0 - 2" />
            <ListBoxItem Content="Item 0 - 3" />
            <ListBoxItem Content="Item 0 - 4" />
            <ListBoxItem Content="Item 0 - 5" />
        </ComboBox>
 
        <ComboBox x:Name="cb2" Grid.Column="1" Margin="2">
            <ListBoxItem Content="Item 1 - 1" />
            <ListBoxItem Content="Item 1 - 2" />
            <ListBoxItem Content="Item 1 - 3" />
            <ListBoxItem Content="Item 1 - 4" />
            <ListBoxItem Content="Item 1 - 5" />
        </ComboBox>
 
        <TextBlock Grid.ColumnSpan="2" Grid.Row="1">
            <TextBlock.Text>
                <MultiBinding StringFormat="cbOne : {0} ### cbTwo : {1}" FallbackValue="Deux items doivent être sélectionnés">
                    <Binding Path="SelectedItem.Content" ElementName="cb1" />
                    <Binding Path="SelectedItem.Content" ElementName="cb2" />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Grid>

La propriété StringFormat du MultiBinding fonctionne comme la méthode statique Format de la classe String. Cette propriéte reçoit en paramètre le format à utiliser et les paramètres qui lui sont passés sont les valeurs des différents bindings

Avec le code XAML ci-dessus, vous verrez que Visual Studio devient muet et nous n’affiche plus le message d’erreur précédent. Je pense d’ailleurs que ce message devait plutôt être « Impossible de définir MutliBinding parce que MutliValueConverter ou StringFormat doit être spécifié ».

Publicités
Catégories :WPF Étiquettes : , ,
%d blogueurs aiment cette page :