WPF - возможно ли отрицать результат выражения привязки данных? - PullRequest
10 голосов
/ 04 декабря 2009

Я знаю, что это прекрасно работает:

<TextBox IsEnabled="{Binding ElementName=myRadioButton, Path=IsChecked}" />

... но я действительно хочу отменить результат выражения привязки, аналогичного приведенному ниже (psuedocode). Возможно ли это?

<TextBox IsEnabled="!{Binding ElementName=myRadioButton, Path=IsChecked}" />

Ответы [ 3 ]

12 голосов
/ 04 декабря 2009

Вы можете сделать это с помощью IValueConverter:

public class NegatingConverter : IValueConverter
{
  public object Convert(object value, ...)
  {
    return !((bool)value);
  }
}

и используйте один из них в качестве конвертера вашей привязки.

5 голосов
/ 01 августа 2011

Если вы хотите, чтобы тип результата отличался от bool, я недавно начал использовать ConverterParameter, чтобы дать себе возможность отменить результирующее значение из моих конвертеров. Вот пример:

[ValueConversion(typeof(bool), typeof(System.Windows.Visibility))]
public class BooleanVisibilityConverter : IValueConverter
{
    System.Windows.Visibility _visibilityWhenFalse = System.Windows.Visibility.Collapsed;

    /// <summary>
    /// Gets or sets the <see cref="System.Windows.Visibility"/> value to use when the value is false. Defaults to collapsed.
    /// </summary>
    public System.Windows.Visibility VisibilityWhenFalse
    {
        get { return _visibilityWhenFalse; }
        set { _visibilityWhenFalse = value; }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool negateValue;
        Boolean.TryParse(parameter as string, out negateValue);

        bool val = negateValue ^ (bool)value;  //Negate the value using XOR
        return val ? System.Windows.Visibility.Visible : _visibilityWhenFalse;
    }
    ...

Этот конвертер преобразует bool в System.Windows.Visibility. Параметр позволяет ему отрицать bool перед конвертацией, если вам нужно обратное поведение. Вы можете использовать его в таком элементе:

Visibility="{Binding Path=MyBooleanProperty, Converter={StaticResource boolVisibilityConverter}, ConverterParameter=true}"
2 голосов
/ 04 декабря 2009

К сожалению, вы не можете напрямую выполнять операторы, такие как отрицание, для выражения Binding ... Я бы порекомендовал использовать ValueConverter для инвертирования логического значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...