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}}" />