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

5

我是WPF的初学者,有些事情我似乎无法理解。

我有一个 CheckBox,当没有选择 RadioButton 时,我想要禁用它。 我的当前语法是:

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

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

20

您需要使用所谓的值转换器(实现了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>

是的...我考虑过那个,但我想看看是否有更直接的方法。 - SiN
2
随着您越来越多地使用WPF,您会发现自己创建了一组相当复杂的转换器,并且它们的设计通常非常可重用。事实上,我确实有一个NegateConverter,但它比我的示例要强大得多。它可以否定数字、布尔值、可见性、厚度等。这只是我经常使用的约十几个转换器之一。 - Josh
var thickness2 = new Thickness(-t1.Left, -t1.Top, -t1.Right, -t1.Bottom);厚度2变量 = 新 厚度(-t1.左边, -t1.顶部, -t1.右边, -t1.底部); - Josh
3
实际上,我刚刚在博客中写过它... http://josheinstein.com/blog/index.php/2010/06/a-multi-purpose-negateconverter-for-wpfsilverlight/ - Josh
添加一些糖... return (value 是 bool 类型) ? !(bool)value : value; - Amsakanna
显示剩余3条评论

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

0

您当前的语法已经满足了您的需求。如果单选按钮未被选中,它将禁用复选框。

如果您真的想要反转情况,您只需要一个转换器。请查看示例


0

这个怎么样:

创建一个布尔值转换器:

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 中导入实现 Inverter 类的命名空间:

xmlns:util="clr-namespace:MyApp.Utilities"

在资源部分添加对逆变器类的引用:
<util:BooleanValueInverter x:Key="Inverter" />

然后就可以像这样简单地使用它:

<TextBox Text="{Binding Path=TextProperty}" IsEnabled="{Binding SomeBoolPropertyToInvert, Converter={StaticResource Inverter}}"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接