Silverlight 4: как переключить контроль видимости - PullRequest
8 голосов
/ 07 сентября 2010

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

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

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

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

Спасибо!

Ответы [ 2 ]

9 голосов
/ 07 сентября 2010

Я просто использовал Reflector для проверки преобразователей типов в 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));
    }
}
5 голосов
/ 07 сентября 2010

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

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

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}}"/>
...