【问题标题】:Silverlight 4: how to switch control visibilitySilverlight 4:如何切换控件可见性
【发布时间】: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 属性的字符串表示并不是最好的方法。

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

谢谢!

【问题讨论】:

    标签: silverlight mvvm binding silverlight-4.0 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 标记)。
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2020-09-20
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多