2010-05-28 13 views

risposta

42

Questo tipo di domanda viene posta così spesso e le risposte così simile ho pensato il suo tempo di avere una sola risposta a tutti (ok può "la maggior parte") del bool alle domande di conversione di valore. L'ho bloggato here.

Il codice è abbastanza semplice quindi mi incollo anche qui: -

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

Ora è possibile creare convertitore per la visibilità con una battuta: -

public class BoolToVisibilityConverter : BoolToValueConverter<Visibility> { } 

Allora per voi in grado di creare un convertitore di esempio, in una risorsa come questo: -

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

Annotare il TrueValue e FalseValue sono scambiati dall'ordine più naturale che ti dà la logica invertita che volevi. Con questo in Resources nel vostro UserControl o anche App.xaml ora è possibile utilizzarlo per associare alla proprietà CanDownload a TextBoxVisibility proprietà: -

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

ottimo. grazie per la risposta. questo è quello che stavo cercando. – joblot

+0

sto avendo uno strano problema. quando passo al metodo Convert e passa il mouse su targetType che dice System.Windows.Visibility ma controlla se (targetType è Visibility) fallisce. quando faccio targetType.GetType(). ToString() nella finestra immediata restituisce System.RuntimeType! Sono confuso cosa sta succedendo qui – joblot

+0

questo è come sto legando

0

sono stato in grado di risolvere questo per un recente progetto che utilizza un bool al convertitore di visibilità:

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 
}  

penso che avrei potuto probabilmente sostituite questa linea:

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

con qualcosa di più semplice come questo:

if (value is Visibility) 

stesso con il getType bool, ma si ottiene l'idea.

Naturalmente, nel convertitore è possibile invertire i valori di visibilità in base alle esigenze di visibilità. Spero che questo aiuti un po '.

4

Uso un parametro BoolToVisibilityConverter che consente di passare "Inverse" come ConverterParameter per invertire la conversione e mostrare solo se la proprietà è falsa.

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

Questo è l'ideale in quanto è necessario un solo parametro. – funwhilelost