Suspendre ou annuler un binding

Il arrive parfois que l’on veuille supprimer ou annuler temporairement un binding. C’est un cas qui arrive souvent, surtout sur les bindings TwoWay quand l’ensemble des valeurs possibles de l’objet bindé est plus vaste que celui du contrôle UI sur lequel il est représenté.

Dans l’exemple suivant, imaginons que la valeur métier bindée à mySlider soit INullable<int> et que nous souhaiterions la faire passer à null. Il faudra se libérer du binding avant de pouvoir lui donner la valeur voulue sans quoi le contrôle ne saura pas suivre car Slider.Value est un int. Le problème est résolu par le biais d’un DataTrigger lié à une DependencyProperty (ici myCheckBox.IsChecked) : lorsque le trigger est déclenché la propriété bindée (Value) est remise à null ce qui annule le binding.

(A tester dans XamlPad/Kaxaml pour un résultat instantané)

<Page

xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">

<GroupBox>

<GroupBox.Header>

<CheckBox x:Name="myCheckBox">Attacher le binding?</CheckBox>

</GroupBox.Header>

<StackPanel>

<Slider x:Name="mySlider"/>

<Label x:Name="myLabel">

<Label.Style>

<Style>

<!-- On met les valeurs que l'on veut par défaut -->

<Setter Property="Label.Content" Value="{Binding ElementName=mySlider,Path=Value}"/>

<!-- Et dans les triggers on met les situations spéciales, je bind ici sur IsChecked

mais cela pourrait être n'importe quelle DependencyProperty -->

<Style.Triggers>

<DataTrigger Binding="{Binding ElementName=myCheckBox,Path=IsChecked}" Value="False">

<Setter Property="Label.Content" Value="Pas bindé!"/>

</DataTrigger>

</Style.Triggers>

</Style>

</Label.Style>

</Label>

</StackPanel>

</GroupBox>

</Page>