Silverlight Привязать к обратному значению логического свойства - PullRequest
11 голосов
/ 28 мая 2010

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

Спасибо

Ответы [ 3 ]

42 голосов
/ 28 мая 2010

Такого рода вопросы задаются так часто, а ответы так похожи. Я думал, что пришло время получить один ответ на все (хорошо, может быть, «большинство») из вопросы преобразования стоимости. Я написал это здесь .

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

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}}" />
4 голосов
/ 28 мая 2010

Я использую 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();
    }
}
0 голосов
/ 28 мая 2010

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

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

...