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?

¿Fue útil?

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"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top