Я хочу привязать видимость элементов управления для обращения к значению boolean. У меня есть свойство CanDownload, если оно истинно, тогда я хочу скрыть текстовое поле и наоборот. Как я могу достичь этого?
Спасибо
Я хочу привязать видимость элементов управления для обращения к значению boolean. У меня есть свойство CanDownload, если оно истинно, тогда я хочу скрыть текстовое поле и наоборот. Как я могу достичь этого?
Спасибо
Этот вопрос задается так, и ответы 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}}" />
Я использую 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();
}
}
Я смог решить это для недавнего проекта, используя конвертер 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, но вы получите эту идею.
Конечно, в вашем конвертере вы можете отменить значения видимости в зависимости от ваших потребностей видимости. Надеюсь, это поможет немного.