2010-09-07 15 views
8

Sto utilizzando MVVM nella mia app Silverlight. Quando si ha bisogno di essere gestito da dati visibilità di controllo, Sto collegando la sua proprietà 'visibilità' per oggetto proprietà corrispondente:Silverlight 4: come cambiare la visibilità del controllo

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

Ma dal mio punto di vista, restituire la rappresentazione di stringa della proprietà Visibility non è un approccio ottimale.

Potresti consigliare se esiste un modo migliore?

Grazie!

risposta

9

ho appena usato Reflector per ispezionare i convertitori di tipi nel PresentationFramework.dll

C'è già un'implementazione che può convertire tra booleano e visibilità. Dovresti essere in grado di farne uso nella tua applicazione 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

Grazie per esempio. Sai perché ReSharper dice: "nullable.HasValue" è sempre vero? – Budda

5

Ho affrontato il problema di legare un valore booleano alla proprietà visibilità, così ho implementato il mio booleano Visibilità Converter, lo sto usando con la maggior parte delle mie applicazioni.

aggiungere la classe segue per la vostra applicazione:

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

Ora per usarlo è necessario aggiungerlo come una risorsa nel codice XAML.

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

Nel tuo esempio utilizzare il seguente:

<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

Grazie per l'esempio COMPLETO (non ero a conoscenza del markup XAML). – Budda

Problemi correlati