根据单选按钮选择显示控件

6

我有一个由三个单选按钮组成的组。根据所选单选按钮,我想要显示其中之一的三个控件 - 文本框、下拉列表或按钮。如何根据所选单选按钮的结果显示控件?

2个回答

17

您可以使用 BooleanToVisibilityConverter ,将控件的可见性绑定到 RadioButton 的 IsChecked 属性:

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

编辑:

这个解决方案非常好,实现起来也很简单。有没有办法可以防止在设计模式下隐藏控件?

我不知道其他的设计工具(例如Blend),但在Visual Studio设计器中,控件从未被隐藏...

无论如何,您可以实现自己的转换器,该转换器将始终在设计模式下返回Visible。由于某个不明原因,BooleanToVisibilityConverter类是密封的,因此您无法从中继承。如果您不想重写转换逻辑,可以将转换委托给BooleanToVisibilityConverter:

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
}

那个解决方案非常好,而且实现起来很简单。有没有办法可以防止控件在设计模式下被隐藏? - DenaliHardtail

1
为了在设计时保持组件可见,您可以将FallbackValue设置为true,如下所示添加到复选框中:
<RadioButton x:Name="cbxEmail" Content="Email Details" IsEnabled="{Binding IsEmail, FallbackValue=true}" IsChecked="{Binding IsEmail, Mode=OneWay, FallbackValue=true}"
                                Grid.Column="2"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接