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

Posted

技术标签:

【中文标题】Silverlight 4:如何切换控件可见性【英文标题】:Silverlight 4: how to switch control visibility 【发布时间】:2011-04-08 23:39:39 【问题描述】:

我在我的 Silverlight 应用程序中使用 MVVM。当需要通过数据管理控件的可见性时,我将其“可见性”属性连接到对象的相应属性:

XAML:

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

代码隐藏(C#):

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

但在我看来,返回 Visibility 属性的字符串表示并不是最好的方法。

请问有什么更好的方法吗?

谢谢!

【问题讨论】:

【参考方案1】:

我刚刚使用 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));
    

【讨论】:

谢谢你的例子。你知道为什么 ReSharper 告诉:“nullable.HasValue”总是正确的吗?【参考方案2】:

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

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

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 标记)。

以上是关于Silverlight 4:如何切换控件可见性的主要内容,如果未能解决你的问题,请参考以下文章

动态换出或切换控件的可见性

覆盖 2 个控件并使用 WPF 切换哪一个可见

Silverlight DataGridTextColumn 绑定可见性

分析 Silverlight 4

如何检测控件的可见性?

如何识别控件的可见性是不是被用户更改?