web-dev-qa-db-fra.com

Liaison à l'état IsChecked de WPF ToggleButton

J'aimerais utiliser une variable WPF ToggleButton pour développer et réduire certains contrôles de mon application. Comment puis-je utiliser XAML pour accomplir cela?

Je pense que je pourrais en quelque sorte lier l’attribut Visibility de certains contrôles à l’état ToggleButton's IsChecked, mais je ne sais pas comment faire cela.

Peut-être que j'ai besoin de donner à ma ToggleButton une Name, puis de la lier à l'aide de ElementName? Ensuite, il me faudrait une ValueConverter pour convertir entre une valeur booléenne et une visibilité, correct? Comment pourrais-je créer une ValueConverter générique à cette fin?

21
M. Dudley

Vous devez lier la Visibility via un convertisseur:

<Window
  x:Class="WpfApplication1.Window1"
  xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">
  <Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
  </Window.Resources>
  <StackPanel>
    <ToggleButton x:Name="toggleButton" Content="Toggle"/>
    <TextBlock
      Text="Some text"
      Visibility="{Binding IsChecked, ElementName=toggleButton, Converter={StaticResource BooleanToVisibilityConverter}}"/>
  </StackPanel>
</Window>

Dans Silverlight, il n'y a pas de BooleanToVisibilityConverter mais il est facile d'écrire votre propre avec quelques fonctionnalités supplémentaires:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace WpfApplication1 {

  public class BooleanToVisibilityConverter : IValueConverter {

    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) {
      if (targetType == typeof(Visibility)) {
        var visible = System.Convert.ToBoolean(value, culture);
        if (InvertVisibility)
          visible = !visible;
        return visible ? Visibility.Visible : Visibility.Collapsed;
      }
      throw new InvalidOperationException("Converter can only convert to value of type Visibility.");
    }

    public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) {
      throw new InvalidOperationException("Converter cannot convert back.");
    }

    public Boolean InvertVisibility { get; set; }

  }

}

Vous pouvez maintenant spécifier un convertisseur qui mappe true à Collapsed et false à Visible:

<BooleanToVisibilityConverter
  x:Key="InverseBooleanToVisibilityConverter" InvertVisibility="True"/>
41
Martin Liversage

Utilisez le BooleanToVisibilityConverter:

<BooleanToVisibilityConverter x:Key="bvc" />
<TextBlock Visibility="{Binding IsChecked, ElementName=toggle, Converter={StaticResource bvc}}" />
8
itowlson

Y a-t-il une raison pour laquelle vous n'utilisez pas simplement le Expander ? Il est basé sur le bouton bascule de toute façon.

0
Steven Robbins