在WPF中,我正在使用BooleanToVisibilityConverter
将一个控件的Visibility
属性绑定到一个Boolean
。这个方法是可行的,但是如果这个布尔值是true
,我希望其中一个控件隐藏,如果它是false
,则显示。
在WPF中,我正在使用BooleanToVisibilityConverter
将一个控件的Visibility
属性绑定到一个Boolean
。这个方法是可行的,但是如果这个布尔值是true
,我希望其中一个控件隐藏,如果它是false
,则显示。
不必反转,您可以通过使用通用的 IValueConverter
实现来实现相同的目标,该实现可以将布尔值转换为可配置的 true 和 false 目标值。以下是一个这样的实现:
public class BooleanConverter<T> : IValueConverter
{
public BooleanConverter(T trueValue, T falseValue)
{
True = trueValue;
False = falseValue;
}
public T True { get; set; }
public T False { get; set; }
public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value is bool && ((bool) value) ? True : False;
}
public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value is T && EqualityComparer<T>.Default.Equals((T) value, True);
}
}
T
是 Visibility
:public sealed class BooleanToVisibilityConverter : BooleanConverter<Visibility>
{
public BooleanToVisibilityConverter() :
base(Visibility.Visible, Visibility.Collapsed) {}
}
最后,以下是如何在XAML中使用BooleanToVisibilityConverter
并配置它,例如将Collapsed
用于true,将Visible
用于false:
<Application.Resources>
<app:BooleanToVisibilityConverter
x:Key="BooleanToVisibilityConverter"
True="Collapsed"
False="Visible" />
</Application.Resources>
当你想绑定到一个名为IsHidden
的布尔属性而不是IsVisible
时,这种反转很有用。
Visibility
属性了。 - Aaronaught自己编写代码是目前最佳的解决方案。这里有一个可以实现正常和反转两种方式转换的示例。如果您在使用过程中遇到任何问题,请随时提问。
[ValueConversion(typeof(bool), typeof(Visibility))]
public class InvertableBooleanToVisibilityConverter : IValueConverter
{
enum Parameters
{
Normal, Inverted
}
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var boolValue = (bool)value;
var direction = (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);
if(direction == Parameters.Inverted)
return !boolValue? Visibility.Visible : Visibility.Collapsed;
return boolValue? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return null;
}
}
<UserControl.Resources>
<Converters:InvertableBooleanToVisibilityConverter x:Key="_Converter"/>
</UserControl.Resources>
<Button Visibility="{Binding IsRunning, Converter={StaticResource _Converter}, ConverterParameter=Inverted}">Start</Button>
BooleanToVisibilityConverter
的替代品:Parameter direction = Parameter.Normal; if (parameter != null) direction = (Parameter)Enum.Parse(typeof(Parameter), (string)parameter);
- JCH2kusing System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
public sealed class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var flag = false;
if (value is bool)
{
flag = (bool)value;
}
else if (value is bool?)
{
var nullable = (bool?)value;
flag = nullable.GetValueOrDefault();
}
if (parameter != null)
{
if (bool.Parse((string)parameter))
{
flag = !flag;
}
}
if (flag)
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
var back = ((value is Visibility) && (((Visibility)value) == Visibility.Visible));
if (parameter != null)
{
if ((bool)parameter)
{
back = !back;
}
}
return back;
}
}
然后将一个布尔值作为ConverterParameter传递
<Grid.Visibility>
<Binding Path="IsYesNoButtonSetVisible" Converter="{StaticResource booleanToVisibilityConverter}" ConverterParameter="true"/>
</Grid.Visibility>
else if (value is bool?)
这一部分,ReSharper 告诉我“表达式总是为 false”。另外,if (flag)
部分可以更简洁地重写为 return flag ? Visibility.Visible : Visibility.Collapsed;
。 - Danilo Bargenvar nullable = (bool?)value; flag = nullable.GetValueOrDefault();
can be made much shorter and simple: flag = (bool?)value ?? false;
- ANeves另一种将 ViewModel 布尔值(IsButtonVisible)与 XAML 控件可见性属性绑定的方法。没有编码,没有转换,只需样式。
<Style TargetType={x:Type Button} x:Key="HideShow">
<Style.Triggers>
<DataTrigger Binding="{Binding IsButtonVisible}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Button Style="{StaticResource HideShow}">Hello</Button>
实现自己的IValueConverter实现。 可以参考下面的示例实现:
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx
在Convert方法中,返回你想要的值而不是默认值。
此外,在Codeplex上还有WPF转换器项目。在他们的文档中,他们说你可以使用他们的MapConverter从Visibility枚举转换为布尔值。
<Label>
<Label.Visible>
<Binding Path="IsVisible">
<Binding.Converter>
<con:MapConverter>
<con:Mapping From="True" To="{x:Static Visibility.Visible}"/>
<con:Mapping From="False" To="{x:Static Visibility.Hidden}"/>
</con:MapConverter>
</Binding.Converter>
</Binding>
</Label.Visible>
</Label>
或者真正的懒人方法,只需利用已经存在的内容并翻转它:
public class InverseBooleanToVisibilityConverter : IValueConverter
{
private BooleanToVisibilityConverter _converter = new BooleanToVisibilityConverter();
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var result = _converter.Convert(value, targetType, parameter, culture) as Visibility?;
return result == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var result = _converter.ConvertBack(value, targetType, parameter, culture) as bool?;
return result == true ? false : true;
}
}
如果您不喜欢编写自定义转换器,您可以使用数据触发器来解决此问题:
<Style.Triggers>
<DataTrigger Binding="{Binding YourBinaryOption}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding YourBinaryOption}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
我刚刚写了一篇关于这个的文章。我使用了和Michael Hohlios类似的想法,只不过我使用了Properties而不是使用“object parameter”。
在WPF中将可见性绑定到布尔值
在我看来,使用Properties使得代码更易读。
<local:BoolToVisibleOrHidden x:Key="BoolToVisConverter" Collapse="True" Reverse="True" />
如果您不想自己编写代码/重复造轮子,可以考虑使用CalcBinding:
// Automatic two way convertion of bool expression to Visibility and
// back if target property has such type: description
<Button Visibility="{c:Binding !IsChecked}" />
<Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" />
CalcBinding在许多其他场景中也非常有用。
public bool ShowMyControl { get { return !theValue; } }
在WPF中 Visibility="{Binding MyModel.ShowMyControl, Converter={StaticResource BooleanToVisibilityConverter}}" - Zamir