WPF. Можно ли отрицать результат выражения привязки данных?
Я знаю, что это прекрасно работает:
<TextBox IsEnabled="{Binding ElementName=myRadioButton, Path=IsChecked}" />
... но то, что я действительно хочу сделать, отрицает результат выражения привязки, подобного ниже (psuedocode). Возможно ли это?
<TextBox IsEnabled="!{Binding ElementName=myRadioButton, Path=IsChecked}" />
Ответы
Ответ 1
Вы можете сделать это с помощью IValueConverter:
public class NegatingConverter : IValueConverter
{
public object Convert(object value, ...)
{
return !((bool)value);
}
}
и используйте один из них как Конвертер вашей привязки.
Ответ 2
Если вам нужен тип результата, отличный от 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}"
Ответ 3
К сожалению, вы не можете напрямую выполнять операторы, такие как отрицание, в выражении Binding... Я бы рекомендовал использовать ValueConverter для инвертирования логического.