Отображение элементов управления на основе выбранной радиокнопки - PullRequest
4 голосов
/ 25 июня 2009

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

Ответы [ 2 ]

16 голосов
/ 25 июня 2009

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

РЕДАКТИРОВАТЬ:

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

Я не знаю других дизайнеров (например, 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
}
1 голос
/ 15 апреля 2014

Чтобы оставить компонент видимым во время разработки, вы можете добавить FallbackValue из true к флажку как:

<RadioButton x:Name="cbxEmail" Content="Email Details" IsEnabled="{Binding IsEmail, FallbackValue=true}" IsChecked="{Binding IsEmail, Mode=OneWay, FallbackValue=true}"
                                Grid.Column="2"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...