Mostrar controles basados en el botón de radio seleccionado
-
20-08-2019 - |
Pregunta
Tengo un grupo de tres botones de radio. Dependiendo de qué botón de radio esté seleccionado, quiero desactivar uno de los tres controles: un cuadro de texto, una lista desplegable o un botón. ¿Cómo visualizo los controles en función del resultado de un botón de opción seleccionado?
Solución
Puede vincular la visibilidad del control a la propiedad IsChecked del RadioButton, utilizando BooleanToVisibilityConverter
:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<BooleanToVisibilityConverter x:Key="convVisibility"/>
</Page.Resources>
<Grid>
<StackPanel Orientation="Vertical">
<RadioButton Name="radioButton1" GroupName="group1">Control1</RadioButton>
<RadioButton Name="radioButton2" GroupName="group1">Control2</RadioButton>
<RadioButton Name="radioButton3" GroupName="group1">Control3</RadioButton>
<Grid>
<Button Visibility="{Binding IsChecked, ElementName=radioButton1, Converter={StaticResource convVisibility}}">1. Button</Button>
<TextBlock Visibility="{Binding IsChecked, ElementName=radioButton2, Converter={StaticResource convVisibility}}">2. TextBlock</TextBlock>
<TextBox Visibility="{Binding IsChecked, ElementName=radioButton3, Converter={StaticResource convVisibility}}">3. TextBox</TextBox>
</Grid>
</StackPanel>
</Grid>
</Page>
EDITAR:
Que las soluciones funcionan muy bien y es fácil de implementar. ¿Hay alguna forma de evitar que los controles se oculten en el modo de diseño?
No sé sobre otros diseñadores (Blend, por ejemplo), pero en el diseñador de Visual Studio los controles nunca están ocultos ...
De todos modos, podría implementar su propio convertidor, que siempre devolvería Visible en modo de diseño. Por alguna oscura razón, la clase BooleanToVisibilityConverter está sellada, por lo que no puede heredarla. En su lugar, puede delegar la conversión a un BooleanToVisibilityConverter, si no desea reescribir la lógica de conversión:
public class MyBooleanToVisibilityConverter : IValueConverter
{
private BooleanToVisibilityConverter _converter = new BooleanToVisibilityConverter();
private DependencyObject _dummy = new DependencyObject();
private bool DesignMode
{
get
{
return DesignerProperties.GetIsInDesignMode(_dummy);
}
}
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (DesignMode)
return Visibility.Visible;
else
return _converter.Convert(value, targetType, parameter, culture);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return _converter.ConvertBack(value, targetType, parameter, culture);
}
#endregion
}
Otros consejos
Para mantener el componente visible durante el tiempo de diseño, puede agregar un FallbackValue
de true
a la casilla de verificación como:
<RadioButton x:Name="cbxEmail" Content="Email Details" IsEnabled="{Binding IsEmail, FallbackValue=true}" IsChecked="{Binding IsEmail, Mode=OneWay, FallbackValue=true}"
Grid.Column="2"/>