2009-12-04 33 views
10

私はこれが正常に動作します知っている:WPF - データバインディング式の結果を否定できますか?

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

...しかし、私が本当にやりたいことは以下と同様の結合の式(擬似コード)の結果を否定です。これは可能ですか?

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

答えて

12

あなたはIValueConverterを使用してこれを行うことができます。

+1

:あなたはこのような要素でそれを使用することができますコンバータ。 – jpierson

2

残念ながら、あなたが直接、このような否定として、演算子を実行することはできません、バインディング式に...私はブール値を反転させるValueConverterを使用することをお勧めします。

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

をし、あなたのバインディングのコンバータとして、これらのいずれかを使用します。

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

関連する問題