У меня есть группа из трех переключателей. В зависимости от того, какой переключатель выбран, я хочу отключить один из трех элементов управления - текстовое поле, раскрывающийся список или кнопку. Как отображать элементы управления на основе результата выбранного переключателя?Отображение элементов управления на основе выбранной радиокнопки
ответ
Вы можете связать видимость управления к 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
}
Чтобы сохранить компонент видимым во время разработки вы можете добавить FallbackValue
из true
с флажком, как:
<RadioButton x:Name="cbxEmail" Content="Email Details" IsEnabled="{Binding IsEmail, FallbackValue=true}" IsChecked="{Binding IsEmail, Mode=OneWay, FallbackValue=true}"
Grid.Column="2"/>
Это решение отлично работает и его просто реализовать. Есть ли способ предотвратить скрытие элементов управления в режиме разработки? – DenaliHardtail
Я обновил сообщение, чтобы ответить на этот вопрос –