IsEnabled的WPF元素数据绑定(但为false)

3mpgtkmj  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(207)

我是WPF的一个新手,有些事情我似乎搞不懂。
我有一个CheckBox,我想在没有选择RadioButton时禁用它。我当前的语法是:

<CheckBox IsEnabled="{Binding ElementName=rbBoth, Path=IsChecked}">Show all</CheckBox>

所以基本上,我希望IsEnabled取与我当前提供的绑定表达式相反的值。
我该怎么做?谢谢。

aiazj4mn

aiazj4mn1#

您需要使用一个称为值转换器的类(实现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>
f0brbegy

f0brbegy2#

<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>
vcudknz3

vcudknz33#

这个怎么样:
为布尔值创建转换器:

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

to94eoyn4#

当前语法已满足您的需要。如果未选中单选按钮,则将禁用复选框。
如果你真的想反转这个场景,你所需要的只是一个转换器。

相关问题