Pergunta

Eu tenho um grupo de três botões de rádio. Dependendo de qual botão de opção é selecionado, eu quero um disaply de três controles - uma caixa de texto, uma lista suspensa, ou um botão. Como faço para exibir os controles com base no resultado de um botão de opção selecionado?

Foi útil?

Solução

Você pode vincular a visibilidade do controle para a propriedade IsChecked do RadioButton, usando o 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>

EDIT:

Isso soluções funciona muito bem e é simples de implementar. Existe uma maneira que eu posso evitar que os controles de ser escondido em modo de design?

Eu não sei sobre outros designers (bata por exemplo), mas no designer Visual Studio os controles não estão escondidos ...

De qualquer forma, você pode implementar seu próprio conversor, que sempre retorno visível no modo de design. Por alguma razão obscura a classe BooleanToVisibilityConverter é selado, para que você não pode herdar a partir dele. Você pode delegar a conversão para um BooleanToVisibilityConverter em vez disso, se você não quer reescrever a lógica de conversão:

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
}

Outras dicas

Para manter o visível componente durante tempo de design você pode adicionar um FallbackValue de true para a caixa de seleção como:

<RadioButton x:Name="cbxEmail" Content="Email Details" IsEnabled="{Binding IsEmail, FallbackValue=true}" IsChecked="{Binding IsEmail, Mode=OneWay, FallbackValue=true}"
                                Grid.Column="2"/>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top