代码之家  ›  专栏  ›  技术社区  ›  SiN

isEnabled的wpf元素数据绑定(但为false)

  •  4
  • SiN  · 技术社区  · 15 年前

    我是WPF的初学者,有件事我似乎想不出来。

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

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

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

    我该怎么做?谢谢。

    4 回复  |  直到 8 年前
        1
  •  19
  •   Josh    15 年前

    您需要使用所谓的值转换器(实现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>
    
        2
  •  1
  •   Amsakanna    15 年前

    您当前的语法已经满足了您的需要。如果未选中RadioButton,它将禁用该复选框。

    如果您真的想要反转场景,您所需要的就是一个转换器。看看这个 sample .

        3
  •  0
  •   Istu7    9 年前

    这个怎么样:

    为布尔值创建转换器:

    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}}"/>
    
        4
  •  0
  •   Meysam Chegini    8 年前
    <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>