2009-12-04 51 views
10

我知道這工作得很好:WPF - 是否可以否定數據綁定表達式的結果?

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

...但我真正想要做的是否定類似以下(僞代碼)綁定表達式的結果。這可能嗎?

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

回答

12

可以使用的IValueConverter做到這一點:

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

,並使用其中的一個作爲您綁定的轉換器。

+1

遺憾的是在隨後的結合,你不得不求助於某種類型的管道/以抵消由該值返回的值鏈接技術:您可以在這樣一個元素使用轉換器。 – jpierson 2010-01-26 13:46:51

2

不幸的是,你不能直接執行的運營商,如否定,在綁定表達式......我會建議使用ValueConverter反轉布爾。

5

如果你想要一個除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}" 
+0

非常好的建議,非常感謝! – DreamOfMirrors 2012-06-29 13:32:27

相關問題