WPF BooleanToVisibilityConverter转换为隐藏,而不是折叠时为false?
有没有办法使用现有的WPF BooleanToVisibilityConverter转换器,但将False值转换为隐藏,而不是默认的折叠,或者我应该写我自己的? 我正在一个项目中,这样做很简单(共享的东西进入一个单独的解决scheme,并且重build/签入/合并过程是一个过程的一个杂草丛生的庞然大物),所以我宁愿如果我只能传递一个参数给现有的参数,而不是跳过刚刚提到的箍。
不幸的是,它只能转换为可见或折叠,所以你必须自己写。 这里是根据Reflector的Convert方法:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { bool flag = false; if (value is bool) { flag = (bool)value; } else if (value is bool?) { bool? nullable = (bool?)value; flag = nullable.HasValue ? nullable.Value : false; } return (flag ? Visibility.Visible : Visibility.Collapsed); }
我发现最简单和最好的解决scheme是这样的:
[ValueConversion(typeof(bool), typeof(Visibility))] public sealed class BoolToVisibilityConverter : IValueConverter { public Visibility TrueValue { get; set; } public Visibility FalseValue { get; set; } public BoolToVisibilityConverter() { // set defaults TrueValue = Visibility.Visible; FalseValue = Visibility.Collapsed; } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (!(value is bool)) return null; return (bool)value ? TrueValue : FalseValue; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { if (Equals(value, TrueValue)) return true; if (Equals(value, FalseValue)) return false; return null; } }
当使用它时,只需configuration一个版本,就像这样在XAML中完全实现你所需要的版本:
<Blah.Resources> <local:BoolToVisibilityConverter x:Key="BoolToHiddenConverter" TrueValue="Visible" FalseValue="Hidden" /> </Blah.Resources>
然后在一个或多个绑定中使用它:
<Foo Visibility="{Binding IsItFridayAlready, Converter={StaticResource BoolToHiddenConverter}}" />
这个简单的解决scheme解决隐藏/折叠的偏好以及扭转/否定效果。
SILVERLIGHT用户必须删除[ValueConversion]
声明,因为该属性不是Silverlight框架的一部分。 在WPF中也不是严格需要的,但是与内置的转换器是一致的。
你不能只使用风格而不是转换器? 代码会是这样的:
<Style x:Key="Triggers" TargetType="Button"> <Style.Triggers> <Trigger Property="{Binding ...}" Value="false"> <Setter Property = "Visibility" Value="Hidden"/> </Trigger> </Style.Triggers> </Style>
你需要提供绑定自己的属性来指向你的布尔属性。
我喜欢使用该参数来反转可视性逻辑:要反转逻辑,只需将ConverterParameter = Reverse放入您的xaml代码
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { bool flag = false; if (value is bool) { flag = (bool)value; } var reverse = parameter as string; if(reverse != null && reverse == "Reverse") flag != flag; return (flag ? Visibility.Visible : Visibility.Collapsed); }
我写了BoolToVisibilityConverte,你可以在Parameter中传递不可见状态:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var boolValue = (bool) value; return boolValue ? Visibility.Visible : (parameter ?? Visibility.Hidden); }
所以你可以像这样绑定:
Visibility="{Binding SomeBool, Converter={StaticResource ResourceKey=BooleanToVisibilityConverter}, ConverterParameter={x:Static Visibility.Collapsed}}"
希望这可以帮助 :)