.net - stringformat - WPF BooleanToVisibilityConverter que se convierte en Oculto en lugar de ContraĆdo cuando es falso?
wpf datagrid stringformat (5)
¿Hay alguna forma de utilizar el convertidor BooleanToVisibilityConverter de WPF existente, pero los valores falsos se convierten en ocultos en lugar de colapsar por defecto, o debería simplemente escribir el mío? Estoy en un proyecto en el que es tremenda sobrecarga hacer algo tan simple como este (las cosas compartidas entran en una solución separada, y el proceso de reconstrucción / registro / fusión es un gigante mutado demasiado grande de un proceso), así que preferiría si podría pasar un parámetro al existente que saltar por los aros que acabamos de mencionar.
¿No puedes usar un style lugar de un convertidor? El código sería algo así como:
<Style x:Key="Triggers" TargetType="Button">
<Style.Triggers>
<Trigger Property="{Binding ...}" Value="false">
<Setter Property = "Visibility" Value="Hidden"/>
</Trigger>
</Style.Triggers>
</Style>
Tendrá que proporcionar la propiedad vinculante para señalar su propiedad bool.
Escribí BoolToVisibilityConverte donde puedes pasar el estado invisible en Parameter:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var boolValue = (bool) value;
return boolValue ? Visibility.Visible : (parameter ?? Visibility.Hidden);
}
Entonces puedes enlazar así:
Visibility="{Binding SomeBool, Converter={StaticResource ResourceKey=BooleanToVisibilityConverter}, ConverterParameter={x:Static Visibility.Collapsed}}"
Espero que esto ayude :)
He encontrado la solución más simple y mejor para ser esto:
[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;
}
}
Cuando lo use, simplemente configure una versión que haga exactamente lo que necesita en XAML de esta manera:
<Blah.Resources>
<local:BoolToVisibilityConverter
x:Key="BoolToHiddenConverter"
TrueValue="Visible" FalseValue="Hidden" />
</Blah.Resources>
Luego úsala en uno o más enlaces como este:
<Foo Visibility="{Binding IsItFridayAlready,
Converter={StaticResource BoolToHiddenConverter}}" />
Esta solución simple aborda las preferencias ocultas / contraídas, así como invertir / negar el efecto.
LOS USUARIOS DE SILVERLIGHT deben abandonar la declaración [ValueConversion]
ya que ese atributo no es parte del marco de Silverlight. No es estrictamente necesario en WPF tampoco, pero es consistente con los convertidores incorporados.
Lamentablemente, solo se convierte en Visible o Colapsado, por lo que tendrá que escribir el suyo. Aquí está el método Convert según Reflector:
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);
}
Me gusta usar el parámetro para invertir la lógica de visibilidad: Para invertir la lógica, simplemente ponga: ConverterParameter = Reverse en su código 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);
}