2010-05-28 10 views

Respuesta

42

Este tipo de pregunta se hace por lo frecuencia y las respuestas por lo similares pensé que es hora de tener una única respuesta a todos (bien puede "más") de la bool a las preguntas de conversión de valor. Lo escribí en el blog here.

El código es bastante sencillo así que pego aquí también: -

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

Ahora puede crear convertidor para la visibilidad con una sola línea: -

public class BoolToVisibilityConverter : BoolToValueConverter<Visibility> { } 

Entonces para usted puede crear un convertidor ejemplo, en un recurso como este: -

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

Nota del TrueValue y FalseValue se cambiaron de un orden más natural para darle la lógica invertida que deseaba. Con esto en la Resources en su UserControl o incluso App.xaml ahora se puede utilizar para obligar a la propiedad CanDownload a TextBoxVisibility propiedad: -

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

genial. gracias por responder. eso es lo que estaba buscando. – joblot

+0

tengo un problema extraño. cuando entro al método Convert y me cierro sobre targetType, dice System.Windows.Visibility pero comprueba si (targetType es Visibility) falla. cuando hago targetType.GetType(). ToString() en la ventana inmediata, devuelve System.RuntimeType! Estoy confundido con lo que está pasando aquí – joblot

+0

así es como estoy vinculando joblot

0

yo era capaz de resolver esto para un proyecto reciente utilizando un bool al convertidor de visibilidad:

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 
}  

creo que podría haber probablemente reemplazadas esta línea:

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

con algo más simple como este:

if (value is Visibility) 

mismo con el bool GetType, pero ya se ha hecho una idea.

Por supuesto, en su convertidor puede invertir los valores de visibilidad en función de sus necesidades de visibilidad. Espero que esto ayude un poco.

4

Uso BoolToVisibilityConverter que le permite pasar "Inverso" como el parámetro Convertidor para invertir la conversión y mostrar solo si la propiedad es 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

Esto es ideal ya que sólo necesita un parámetro. – funwhilelost

Cuestiones relacionadas