2009-10-07 4 views
20

Je souhaite utiliser un WPF ToggleButton pour développer et réduire certains contrôles dans mon application. Comment puis-je utiliser XAML pour accomplir ceci?Liaison à un état IsChecked de WPF ToggleButton

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

Peut-être que je dois donner à mon ToggleButton un Name, puis lier en utilisant ElementName? Ensuite, j'aurais besoin d'un ValueConverter pour convertir entre une valeur booléenne et une visibilité, correct? Comment est-ce que je pourrais faire un ValueConverter générique à cette fin?

+6

Vous n'avez pas besoin de: c'est déjà dans le cadre. Recherchez BooleanToVisibilityConverter. – itowlson

Répondre

39

Vous devez lier le Visibility par 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 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; } 

    } 

} 

Maintenant vous un spécifier un convertisseur que les cartes true à Collapsed et false-Visible: « Comment pourrais-je faire un ValueConverter générique à cet effet »

<BooleanToVisibilityConverter 
    x:Key="InverseBooleanToVisibilityConverter" InvertVisibility="True"/> 
+0

Je crois qu'il devrait aussi être possible d'utiliser des déclencheurs d'une manière similaire, à la http://stackoverflow.com/questions/250840/how-do-you-bind-the-textwrapping-property-of-a-textbox- à-la-ischecked-value-of –

+0

qui a fonctionné comme charme..merci martin –

0

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

+0

Je ne fais pas que m'étendre et m'effondrer - je réorganise le contenu. Par exemple, je voudrais définir l'orientation d'un StackPanel et les propriétés TextWrapping et FontSize d'un TextBlock. Je ne l'ai pas précisé car je voulais garder la question simple. –

+0

Assez juste :-) Vous devriez pouvoir lier avec {binding elementname = mytoggle, propertyname = checked} ou même utiliser un trigger sur le toggle pour définir le style des cibles. –

8

Utilisez le BooleanToVisibilityConverter:

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