我想将控件可见性绑定到布尔属性值的反转。我有一个属性CanDownload,如果它是真的那么我想隐藏文本框,反之亦然。我怎样才能做到这一点?
由于
答案 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" />
请注意,TrueValue
和FalseValue
是从更自然的顺序交换,为您提供所需的反转逻辑。在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相同,但你明白了。
当然,在您的转换器中,您可以根据您的可见性需求反转可见度值。希望这有点帮助。