我是 WPF 的初学者,有些东西我似乎无法弄清楚。
当未选择aCheckBox
时,我想禁用它。RadioButton
我目前的语法是:
<CheckBox IsEnabled="{Binding ElementName=rbBoth, Path=IsChecked}">Show all</CheckBox>
所以基本上,我希望 IsEnabled 采用与我当前提供的绑定表达式相反的值。
我怎样才能做到这一点?谢谢。
我是 WPF 的初学者,有些东西我似乎无法弄清楚。
当未选择aCheckBox
时,我想禁用它。RadioButton
我目前的语法是:
<CheckBox IsEnabled="{Binding ElementName=rbBoth, Path=IsChecked}">Show all</CheckBox>
所以基本上,我希望 IsEnabled 采用与我当前提供的绑定表达式相反的值。
我怎样才能做到这一点?谢谢。
您需要使用所谓的值转换器(实现 IValueConverter 的类)。下面显示了此类的一个非常基本的示例。(注意剪辑...)
public class NegateConverter : IValueConverter
{
public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
{
if ( value is bool ) {
return !(bool)value;
}
return value;
}
public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
{
if ( value is bool ) {
return !(bool)value;
}
return value;
}
}
然后要将其包含在您的 XAML 中,您将执行以下操作:
<UserControl xmlns:local="clr-namespace:MyNamespace">
<UserControl.Resources>
<local:NegateConverter x:Key="negate" />
</UserControl.Resources>
...
<CheckBox IsEnabled="{Binding IsChecked, ElementName=rbBoth, Converter={StaticResource negate}}"
Content="Show all" />
</UserControl>
<CheckBox>
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsShowName }" Value="true">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
您当前的语法已经满足您的需求。如果未选中单选按钮,它将禁用复选框。
如果你真的想反转场景,你只需要一个转换器。看看这个样本。
这个怎么样:
为布尔值创建一个转换器:
class BooleanValueInverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(parameter is IValueConverter))
{
if (value is bool)
return !(bool)value;
else
return DependencyProperty.UnsetValue;
}
else
{
IValueConverter converter = (IValueConverter)parameter;
if (value is bool)
{
bool input = !(bool)value;
return converter.Convert(input, targetType, null, culture);
}
else
{
return DependencyProperty.UnsetValue;
}
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
在 xaml 中导入实现逆变器类的命名空间:
xmlns:util="clr-namespace:MyApp.Utilities"
在资源部分添加参考逆变器类:
<util:BooleanValueInverter x:Key="Inverter" />
然后就像这样简单地使用它:
<TextBox Text="{Binding Path=TextProperty}" IsEnabled="{Binding SomeBoolPropertyToInvert, Converter={StaticResource Inverter}}"/>