2009-06-25 2 views
3

У меня есть группа из трех переключателей. В зависимости от того, какой переключатель выбран, я хочу отключить один из трех элементов управления - текстовое поле, раскрывающийся список или кнопку. Как отображать элементы управления на основе результата выбранного переключателя?Отображение элементов управления на основе выбранной радиокнопки

ответ

15

Вы можете связать видимость управления к IsChecked свойству RadioButton, используя 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:

Это решение прекрасно работает, и это просто реализовать. Есть ли способ предотвратить скрытие элементов управления в режиме разработки?

Я не знаю о других дизайнеров (смесь для например), но в конструкторе Visual Studio элементы управления никогда не скрыты ...

Во всяком случае, вы могли бы реализовать свой собственный конвертер, который будет всегда return Видимый в режиме разработки. По какой-то непонятной причине класс 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 
} 
+0

Это решение отлично работает и его просто реализовать. Есть ли способ предотвратить скрытие элементов управления в режиме разработки? – DenaliHardtail

+0

Я обновил сообщение, чтобы ответить на этот вопрос –

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