2010-09-07 2 views
8

Я использую MVVM в своем приложении Silverlight. Когда видимость управления необходимо управлять данными, я подключаю его свойство 'Видимость' для объекта соответствующее свойство:Silverlight 4: как переключить видимость управления

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

Но с моей точки зрения, возвращаемое строковое представление свойства Видимость - не лучший подход.

Не могли бы вы посоветовать, есть ли лучший способ?

Спасибо!

ответ

9

Я просто использовал отражатель для проверки преобразователей типа в PresentationFramework.dll

Существует уже реализация, которая может конвертировать между булевыми и видимостью. Вы должны использовать это в своем приложении 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

Спасибо, например. Вы знаете, почему ReSharper говорит: «nullable.HasValue» всегда верно? – Budda

5

Я столкнулась с проблемой связывания логического значения свойства видимости, поэтому я реализовал свой собственный Boolean обзорности конвертера, я использую его с большинством моих приложений.

Добавьте следующий класс к приложению:

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

Теперь использовать его вам нужно добавить его в качестве ресурса в XAML кодекса.

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

В вашем примере использовать следующее:

<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

Благодарим вас за FULL пример (я тоже не знал о разметке XAML). – Budda

Смежные вопросы