Dot-Net

WPF BooleanToVisibilityConverter 在 false 時轉換為隱藏而不是折疊?

  • June 27, 2010

有沒有辦法使用現有的 WPF BooleanToVisibilityConverter 轉換器,但將 False 值轉換為 Hidden 而不是預設的 Collapsed,或者我應該自己編寫?我在一個項目中,做這樣簡單的事情需要巨大的成本(共享的東西進入一個單獨的解決方案,重建/簽入/合併過程是一個過度生長的變異龐然大物),所以我更喜歡如果我可以只將參數傳遞給現有參數,而不是跳過剛才提到的箍。

不幸的是,它只能轉換為可見或折疊,因此您必須自己編寫。這是根據反射器的轉換方法:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
   bool flag = false;
   if (value is bool)
   {
       flag = (bool)value;
   }
   else if (value is bool?)
   {
       bool? nullable = (bool?)value;
       flag = nullable.HasValue ? nullable.Value : false;
   }
   return (flag ? Visibility.Visible : Visibility.Collapsed);
}

我找到了最簡單和最好的解決方案:

[ValueConversion(typeof(bool), typeof(Visibility))]
public sealed class BoolToVisibilityConverter : IValueConverter
{
 public Visibility TrueValue { get; set; }
 public Visibility FalseValue { get; set; }

 public BoolToVisibilityConverter()
 {
   // set defaults
   TrueValue = Visibility.Visible;
   FalseValue = Visibility.Collapsed;
 }

 public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture)
 {
   if (!(value is bool))
     return null;
   return (bool)value ? TrueValue : FalseValue;    
 }

 public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture)
 {
   if (Equals(value, TrueValue))
     return true;
   if (Equals(value, FalseValue))
     return false;
   return null;
 }
}

使用它時,只需在 XAML 中配置一個完全符合您需要的版本,如下所示:

<Blah.Resources>
 <local:BoolToVisibilityConverter
        x:Key="BoolToHiddenConverter"
        TrueValue="Visible" FalseValue="Hidden" />
</Blah.Resources>

然後在一個或多個綁定中使用它,如下所示:

<Foo Visibility="{Binding IsItFridayAlready, 
                         Converter={StaticResource BoolToHiddenConverter}}" />

這個簡單的解決方案解決了隱藏/折疊的偏好以及反轉/否定效果。

SILVERLIGHT 使用者必須刪除該[ValueConversion]聲明,因為該屬性不是 Silverlight 框架的一部分。它在 WPF 中也不是嚴格需要的,但與內置轉換器一致。

引用自:https://stackoverflow.com/questions/3128023