Enlace de datos de elemento WPF para IsEnabled(pero para falso)
data-binding checkbox (4)
Necesita usar lo que se llama un convertidor de valor (una clase que implementa IValueConverter). A continuación se muestra un ejemplo muy básico de dicha clase. (Cuidado con los recortes ...)
public class NegateConverter : IValueConverter
{
public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
{
if ( value is bool ) {
return !(bool)value;
}
return value;
}
public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
{
if ( value is bool ) {
return !(bool)value;
}
return value;
}
}
Luego, para incluirlo en su XAML, haría algo como:
<UserControl xmlns:local="clr-namespace:MyNamespace">
<UserControl.Resources>
<local:NegateConverter x:Key="negate" />
</UserControl.Resources>
...
<CheckBox IsEnabled="{Binding IsChecked, ElementName=rbBoth, Converter={StaticResource negate}}"
Content="Show all" />
</UserControl>
Soy un principiante en WPF, y hay algo que parece que no puedo entender.
Tengo un CheckBox
que me gustaría desactivar cuando no se selecciona un RadioButton
. Mi sintaxis actual es:
<CheckBox IsEnabled="{Binding ElementName=rbBoth, Path=IsChecked}">Show all</CheckBox>
Entonces, básicamente, quiero que IsEnabled tome el valor opuesto a la expresión vinculante que actualmente estoy suministrando.
¿Cómo puedo hacer esto? Gracias.
Que tal este:
Crea un convertidor para booleanos:
class BooleanValueInverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(parameter is IValueConverter))
{
if (value is bool)
return !(bool)value;
else
return DependencyProperty.UnsetValue;
}
else
{
IValueConverter converter = (IValueConverter)parameter;
if (value is bool)
{
bool input = !(bool)value;
return converter.Convert(input, targetType, null, culture);
}
else
{
return DependencyProperty.UnsetValue;
}
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
en xaml importa el espacio de nombres donde se implementa la clase de inversor:
xmlns:util="clr-namespace:MyApp.Utilities"
En la sección de recursos, agregue referencia a la clase de inversor:
<util:BooleanValueInverter x:Key="Inverter" />
Y luego simplemente utilízala así:
<TextBox Text="{Binding Path=TextProperty}" IsEnabled="{Binding SomeBoolPropertyToInvert, Converter={StaticResource Inverter}}"/>
Su sintaxis actual ya satisface sus necesidades. Deshabilitará la casilla de verificación si el botón de radio no está marcado.
Si realmente quieres invertir el escenario, todo lo que necesitas es un convertidor. Echa un vistazo a esta muestra .
<CheckBox>
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsShowName }" Value="true">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>