2009-12-04 26 views
10

Tôi biết điều này làm tốt:WPF - Có thể phủ nhận kết quả của biểu thức ràng buộc dữ liệu không?

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

... nhưng những gì tôi thực sự muốn làm là phủ nhận kết quả của biểu thức ràng buộc tương tự như dưới đây (psuedocode). Điều này có thể không?

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

Trả lời

12

Bạn có thể làm điều này bằng một IValueConverter:

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

và sử dụng một trong những là Chuyển đổi các ràng buộc của bạn.

+1

Thật không may nếu bạn đã sử dụng công cụ chuyển đổi giá trị trong ràng buộc thì bạn phải sử dụng một số kỹ thuật đường ống/chuỗi để loại bỏ giá trị được trả về bởi giá trị đó chuyển đổi. – jpierson

2

Thật không may, bạn không thể trực tiếp thực hiện các toán tử, như phủ định, trên biểu thức Ràng buộc ... Tôi khuyên bạn nên sử dụng một ValueConverter để đảo ngược boolean.

5

Nếu bạn muốn muốn loại kết quả khác với bool, gần đây tôi đã bắt đầu sử dụng ConverterParameter để cung cấp cho mình tùy chọn phủ nhận giá trị kết quả từ trình chuyển đổi của tôi. Dưới đây là ví dụ:

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

Bộ chuyển đổi này chuyển đổi bool thành System.Windows.Visibility. Tham số cho phép nó phủ nhận bool trước khi chuyển đổi trong trường hợp bạn muốn hành vi nghịch đảo. Bạn có thể sử dụng nó trong một yếu tố như thế này:

Visibility="{Binding Path=MyBooleanProperty, Converter={StaticResource boolVisibilityConverter}, ConverterParameter=true}" 
+0

Một lời khuyên thực sự tốt, cảm ơn bạn rất nhiều! – DreamOfMirrors

Các vấn đề liên quan