Silverlight Привязка к обратному значению логической стоимости

Я хочу привязать видимость элементов управления для обращения к значению boolean. У меня есть свойство CanDownload, если оно истинно, тогда я хочу скрыть текстовое поле и наоборот. Как я могу достичь этого?

Спасибо

Ответ 1

Этот вопрос задается так, и ответы so аналогичны. Я думал, что у него есть один ответ для всех (ok may "most" ) из bool, чтобы оценить вопросы конверсии. Я написал в блоге здесь.

Код довольно прост, поэтому я также вставляю его здесь: -

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

Обратите внимание, что TrueValue и FalseValue заменены более естественным порядком, что дает вам перевернутую логику, которую вы хотели. С этим в Resources в вашем UserControl или даже App.xaml вы можете теперь использовать его для привязки к свойству CanDownload к свойству TextBox Visibility: -

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

Ответ 2

Я использую BoolToVisibilityConverter, который позволяет передавать "Обратный" в качестве преобразователя, чтобы инвертировать преобразование и показывать только в том случае, если свойство является ложным.

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();
    }
}

Ответ 3

Я смог решить это для недавнего проекта, используя конвертер 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, но вы получите эту идею.

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