Silverlight 4: 如何切换控件可见性

8
我正在我的Silverlight应用程序中使用MVVM。当需要通过数据来管理控件的可见性时,我将其“Visibility”属性连接到对象的相应属性:
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"; } }

但是从我的角度来看,返回可见性属性的字符串表示并不是最好的方法。
请问是否有更好的方式?
谢谢!
2个回答

9

我刚刚使用反编译器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));
    }
}

2
谢谢您的示例。您知道为什么ReSharper会告诉我们:“nullable.HasValue”始终为真吗? - Budda

5

我曾经遇到过将布尔值绑定到可见性属性的问题,因此我实现了自己的布尔转可见性转换器,并在大多数应用程序中使用它。

将以下类添加到您的应用程序中:

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

非常感谢您提供完整的示例(我之前不知道XAML标记语言)。 - Budda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接