wpf xaml binding togglebutton

Enlazando al estado IsChecked de WPF ToggleButton



xaml binding (3)

Me gustaría usar un ToggleButton WPF para expandir y contraer algunos controles en mi aplicación. ¿Cómo puedo usar XAML para lograr esto?

Estoy pensando que de alguna manera podría vincular el atributo Visibility de algunos controles al estado IsChecked , pero no sé cómo hacerlo.

¿Tal vez necesito darle un Name mi ToggleButton , luego ToggleButton usando ElementName ? Entonces necesitaría un ValueConverter para convertir entre un valor booleano y una Visibilidad, ¿correcto? ¿Cómo podría hacer un ValueConverter genérico para este propósito?


¿Hay alguna razón por la que no solo estés usando el Expander ? Está basado en ToggleButton de todos modos.


Debes vincular la Visibility través de un convertidor:

<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>

En Silverlight no existe BooleanToVisibilityConverter pero es fácil escribir el suyo con algunas características adicionales:

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; } } }

Ahora puede especificar un convertidor que corresponda con true a Collapsed y false a Visible :

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


Use BooleanToVisibilityConverter:

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