【问题标题】:WPF element databinding for IsEnabled (but for false)IsEnabled 的 WPF 元素数据绑定(但为 false)
【发布时间】:2011-03-07 04:15:58
【问题描述】:

我是 WPF 的初学者,但我似乎无法弄清楚。

我有一个CheckBox,我想在未选择RadioButton 时禁用它。 我目前的语法是:

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

所以基本上,我希望 IsEnabled 采用与我当前提供的绑定表达式相反的值。

我该怎么做?谢谢。

【问题讨论】:

    标签: wpf data-binding checkbox isenabled


    【解决方案1】:

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

    【讨论】:

    • 是的...我想过,但我想看看是否有更直接的方法。
    • 随着您越来越多地使用 WPF,您会发现您创建了一组非常复杂的转换器,并且它们的设计通常非常可重用。事实上,我确实有一个 NegateConverter,但它比我的示例更强大。它否定数字、布尔值、可见性、厚度等。只是我经常使用的十几个转换器中的一个。
    • 乔希:你如何否定厚度?
    • var thickness2 = new Thickness(-t1.Left, -t1.Top, -t1.Right, -t1.Bottom);
    • 这里其实我只是写了一篇博客...josheinstein.com/blog/index.php/2010/06/…
    【解决方案2】:
    <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>
    

    【讨论】:

      【解决方案3】:

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

      如果你真的想反转场景,你只需要一个转换器。看看这个sample

      【讨论】:

        【解决方案4】:

        这个怎么样:

        为布尔值创建一个转换器:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-04
          • 1970-01-01
          • 2018-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-11
          相关资源
          最近更新 更多