2010-09-07 16 views
8

Estoy usando MVVM en mi aplicación Silverlight. Cuando se necesita ser gestionado por los datos de la visibilidad de control, lo voy a conectar su propiedad 'visibilidad' al de objeto correspondiente propiedad:Silverlight 4: cómo cambiar la visibilidad del control

XAML:

<TextBlock Text="Price" Visibility="{Binding PriceVisibility, Mode=OneWay}"/> 
<TextBox Text="{Binding TicketPrice, Mode=TwoWay}" Visibility="{Binding PriceVisibility, Mode=OneWay}"/> 

CodeBehind (C#):

public string PriceVisibility { get { return PriceVisible ? "Visible" : "Collapsed"; } } 

Pero desde mi punto de vista, devolver la representación de cadena de la propiedad Visibilidad no es un mejor enfoque.

¿Podría avisar si hay alguna manera mejor?

Gracias!

Respuesta

9

acabo de utilizar reflector para inspeccionar los convertidores de tipos en el PresentationFramework.dll

Ya existe una aplicación que puede convertir entre booleano y visibilidad. Debería poder hacer uso de esto en su aplicación Silverlight.

public sealed class BooleanToVisibilityConverter : IValueConverter 
{ 
    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); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((value is Visibility) && (((Visibility) value) == Visibility.Visible)); 
    } 
} 
+2

Gracias por ejemplo. ¿Sabes por qué ReSharper dice: "nullable.HasValue" siempre es cierto? – Budda

5

He enfrentado el problema de unirse a un valor booleano a la propiedad de visibilidad, por lo que he aplicado mi propia booleana al convertidor de visibilidad, lo estoy usando con la mayoría de mis aplicaciones.

Agregue la clase siguiente para su aplicación:

public class BoolVisibilityConverter : IValueConverter{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture){ 
     bool isVisible = (bool)value; 
     return isVisible ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){ 
     System.Windows.Visibility currVisibility = (System.Windows.Visibility)value; 
     return (currVisibility == System.Windows.Visibility.Visible); 
    } 
} 

ahora para utilizarlo tendrá que añadirlo como un recurso en el código XAML.

<UserControl.Resources> 
    <Helpers:BoolVisibilityConverter x:Key="boolVisibilityConverter" /> 
</UserControl.Resources> 

En su ejemplo usa la siguiente:

<TextBlock Text="Price" Visibility="{Binding PriceVisibility, Mode=OneWay, Converter={StaticResource boolVisibilityConverter}}"/> 

<TextBox Text="{Binding TicketPrice, Mode=TwoWay}" Visibility="{Binding PriceVisibility, Mode=OneWay, Converter={StaticResource boolVisibilityConverter}}"/> 
+0

Gracias por el ejemplo COMPLETO (no estaba al tanto sobre el marcado XAML). – Budda

Cuestiones relacionadas