2009-12-04 9 views

Odpowiedz

12

Można to zrobić za pomocą IValueConverter:

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

i użyć jednego z nich jako konwerter swój Binding.

+1

Niestety, jeśli już używasz konwertera wartości w wiązaniu, musisz użyć jakiegoś rodzaju techniki łączenia/łączenia, aby zanegować wartość zwróconą przez tę wartość przetwornik. – jpierson

2

Niestety, nie można wykonać bezpośrednio operatorów, takich jak negacji, na ekspresję Binding ... Polecam przy użyciu ValueConverter odwrócić logiczną.

5

Jeśli chcesz uzyskać typ wyniku inny niż bool, niedawno zacząłem używać parametru ConverterParameter, aby dać sobie możliwość zanegowania wartości wynikowej z moich konwerterów. Oto przykład:

[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; 
    } 
    ... 

Ten konwerter konwertuje wartość bool na System.Windows.Visibility. Parametr pozwala mu zanegować wartość bool przed konwersją, jeśli chcesz zachować odwrotność. Możesz go użyć w takim elemencie jak ten:

+0

Naprawdę dobra rada, dziękuję bardzo! – DreamOfMirrors

Powiązane problemy