Привязка данных элемента WPF для IsEnabled (но для false) - PullRequest
5 голосов
/ 23 июня 2010

Я начинающий в WPF, и есть кое-что, что я не могу понять.

У меня есть CheckBox, который я хотел бы отключить, когда RadioButton не выбран. Мой текущий синтаксис:

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

Итак, я хочу, чтобы IsEnabled принял значение, противоположное выражению привязки, которое я сейчас предоставляю.

Как я могу это сделать? Благодаря.

Ответы [ 4 ]

20 голосов
/ 23 июня 2010

Вам нужно использовать так называемый конвертер значений (класс, который реализует 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>
1 голос
/ 23 июня 2010

Ваш текущий синтаксис уже удовлетворяет ваши потребности. Он отключит этот флажок, если кнопка радио не включена.

Если вы действительно хотите инвертировать сценарий, все, что вам нужно, это конвертер. Взгляните на этот образец .

0 голосов
/ 10 августа 2016
<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 голосов
/ 02 августа 2015

Как насчет этого:

Создание конвертера для логических значений:

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