Silverlight绑定到布尔属性值的反转

时间:2010-05-28 03:16:21

标签: silverlight silverlight-3.0

我想将控件可见性绑定到布尔属性值的反转。我有一个属性CanDownload,如果它是真的那么我想隐藏文本框,反之亦然。我怎样才能做到这一点?

由于

3 个答案:

答案 0 :(得分:42)

这类问题经常被问到如此,答案如此类似我觉得是时候对所有人(好吧可能“最”)给出一个答案bool价值转换问题。我在博客上发表了here

代码非常简单,所以我也会在这里粘贴: -

public class BoolToValueConverter<T> : IValueConverter
{
    public T FalseValue { get; set; }
    public T TrueValue { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return FalseValue;
        else
            return (bool)value ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null ? value.Equals(TrueValue) : false;
    }
}

现在,您可以使用单行创建转换器以实现可见性: -

public class BoolToVisibilityConverter : BoolToValueConverter<Visibility> { }

然后,您可以在如下资源中创建实例转换器: -

<local:BoolToVisibilityConverter x:Key="InverseVisibility" TrueValue="Collapsed" FalseValue="Visible" />

请注意,TrueValueFalseValue是从更自然的顺序交换,为您提供所需的反转逻辑。在Resources甚至App.xaml的UserControl中,您可以使用它绑定到CanDownload属性到TextBox Visibility属性: -

<TextBox Visibility="{Binding CanDownload, Converter={StaticResource InverseVisibility}}" />

答案 1 :(得分:4)

我使用BoolToVisibilityConverter,它允许您将“Inverse”作为ConverterParameter传递以反转转换,并仅在属性为false时显示。

public class BoolToVisibilityConverter : IValueConverter
{
    /// <exception cref="ArgumentException">TargetType must be Visibility</exception>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(!(value is bool))
            throw new ArgumentException("Source must be of type bool");

        if(targetType != typeof(Visibility))
            throw new ArgumentException("TargetType must be Visibility");

        bool v = (bool) value;

        if(parameter is string && parameter.ToString() == "Inverse")
            v = !v;

        if (v)
            return Visibility.Visible;
        else
            return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

答案 2 :(得分:0)

我能够使用bool to visibility转换器为最近的项目解决这个问题:

public class BoolToVisibilityConverter : IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value.GetType().Equals(typeof(bool)))
        {
            if ((bool)value == true)
                return Visibility.Visible;
            else
                return Visibility.Collapsed;
        }
        else
            return Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value.GetType().Equals(typeof(Visibility)))
        {
            if ((Visibility)value == Visibility.Collapsed)
                return false;
            else
                return true;
        }
        else
            return false;

    }

    #endregion
}    

我想我可能已经取代了这一行:

if (value.GetType().Equals(typeof(Visibility)))

这样的事情更简单:

if (value is Visibility)

与bool GetType相同,但你明白了。

当然,在您的转换器中,您可以根据您的可见性需求反转可见度值。希望这有点帮助。