2010-05-28 39 views

Trả lời

42

này loại câu hỏi được hỏi nên thường xuyên và các câu trả lời nên tương tự tôi nghĩ thời gian của mình để có một câu trả lời duy nhất để tất cả (ok có thể "nhất") của bool cho những câu hỏi giá trị chuyển đổi. Tôi đã viết blog nó here.

Mã này là khá đơn giản vì vậy tôi sẽ dán nó ở đây quá: -

public class BoolToValueConverter<T> : IValueConverter 
{ 
    public T FalseValue { get; set; } 
    public T TrueValue { get; set; } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
      return FalseValue; 
     else 
      return (bool)value ? TrueValue : FalseValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value != null ? value.Equals(TrueValue) : false; 
    } 
} 

Bây giờ bạn có thể tạo chuyển đổi để tầm nhìn với một lớp lót: -

public class BoolToVisibilityConverter : BoolToValueConverter<Visibility> { } 

Sau đó cho bạn có thể tạo trình chuyển đổi thể hiện trong tài nguyên như sau: -

<local:BoolToVisibilityConverter x:Key="InverseVisibility" TrueValue="Collapsed" FalseValue="Visible" /> 

Lưu ý TrueValueFalseValue được hoán đổi xung quanh từ thứ tự tự nhiên hơn cho bạn logic ngược mà bạn muốn. Với điều này trong Resources trong UserControl hoặc bạn thậm chí App.xaml bây giờ bạn có thể sử dụng nó để liên kết với CanDownload tài sản để TextBoxVisibility bất động sản: -

<TextBox Visibility="{Binding CanDownload, Converter={StaticResource InverseVisibility}}" /> 
+0

tuyệt vời. cảm ơn bạn đã trả lời. đó là những gì tôi đang tìm kiếm. – joblot

+0

tôi đang gặp vấn đề lạ. khi tôi bước vào phương pháp chuyển đổi và di chuột qua targetType nó nói System.Windows.Visibility nhưng kiểm tra nếu (targetType là Visibility) không thành công. khi tôi làm targetType.GetType(). ToString() trong cửa sổ ngay lập tức nó trả về System.RuntimeType! tôi đang bối rối những gì đang xảy ra ở đây – joblot

+0

đây là cách tôi đang ràng buộc

0

tôi đã có thể giải quyết việc này cho một dự án gần đây sử dụng một bool để chuyển đổi visibility:

public class BoolToVisibilityConverter : IValueConverter 
{ 

    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value.GetType().Equals(typeof(bool))) 
     { 
      if ((bool)value == true) 
       return Visibility.Visible; 
      else 
       return Visibility.Collapsed; 
     } 
     else 
      return Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value.GetType().Equals(typeof(Visibility))) 
     { 
      if ((Visibility)value == Visibility.Collapsed) 
       return false; 
      else 
       return true; 
     } 
     else 
      return false; 

    } 

    #endregion 
}  

Tôi nghĩ rằng tôi có thể có thể thay thế dòng này:

if (value.GetType().Equals(typeof(Visibility))) 

với một cái gì đó đơn giản hơn như thế này:

if (value is Visibility) 

giống với bool GetType, nhưng bạn có ý tưởng.

Tất nhiên, trong trình chuyển đổi, bạn có thể đảo ngược các giá trị khả năng hiển thị dựa trên nhu cầu hiển thị của bạn. Hy vọng điều này sẽ giúp một chút.

4

Tôi sử dụng một BoolToVisibilityConverter cho phép bạn chuyển "nghịch đảo" như là ConverterParameter để đảo ngược chuyển đổi và chỉ hiển thị nếu thuộc tính là sai.

public class BoolToVisibilityConverter : IValueConverter 
{ 
    /// <exception cref="ArgumentException">TargetType must be Visibility</exception> 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if(!(value is bool)) 
      throw new ArgumentException("Source must be of type bool"); 

     if(targetType != typeof(Visibility)) 
      throw new ArgumentException("TargetType must be Visibility"); 

     bool v = (bool) value; 

     if(parameter is string && parameter.ToString() == "Inverse") 
      v = !v; 

     if (v) 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Đây là lý tưởng vì bạn chỉ cần một tham số. – funwhilelost

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