【问题标题】:Displaying controls based on radio button selected根据选择的单选按钮显示控件
【发布时间】:2010-11-05 21:32:25
【问题描述】:

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

【问题讨论】:

    标签: .net wpf vb.net radio-button


    【解决方案1】:

    您可以使用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
    }
    

    【讨论】:

    • 该解决方案效果很好,并且易于实施。无论如何我可以防止控件在设计模式下被隐藏?
    【解决方案2】:

    要在设计时保持组件可见,您可以将FallbackValuetrue 添加到复选框,如下所示:

    <RadioButton x:Name="cbxEmail" Content="Email Details" IsEnabled="{Binding IsEmail, FallbackValue=true}" IsChecked="{Binding IsEmail, Mode=OneWay, FallbackValue=true}"
                                    Grid.Column="2"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2013-09-21
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多