para etiquetas estilos botones c# wpf binding combobox isenabled

etiquetas - C#WPF IsEnabled usando enlaces mĂșltiples?



estilos para botones wpf (4)

Como extensión a la respuesta de qqbenq:

Se agregó la función para manejar el Count de una colección, por ejemplo, si desea verificar si se seleccionó algún elemento de un ListView .

Convertidor:

public class IsEnabledConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { foreach (var value in values) { switch (value) { case bool b when !b: case int i when i == 0: return false; } } return true; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { return null; } }

Espacio de nombres <theNamespace:IsEnabledConverter x:Key="IsEnabledConverter"/>

Botón

<Button x:Name="MyButton"> <Button.IsEnabled> <MultiBinding Converter="{StaticResource IsEnabledConverter}"> <Binding ElementName="MyListView" Path="SelectedItems.Count"/> <Binding ElementName="MyCheckBox" Path="IsChecked"/> </MultiBinding> </Button.IsEnabled> </Button>

Tengo un archivo WPF xaml que describe una sección de una GUI y me gustaría que la activación / desactivación de un control en particular dependa de otras dos. El código se ve algo así en este momento:

<ComboBox Name="MyComboBox" IsEnabled="{Binding ElementName=SomeCheckBox, Path=IsChecked}"/>

Pero me gustaría que dependa también de otra casilla de verificación, así que algo así como:

<ComboBox Name="MyComboBox" IsEnabled="{Binding ElementName=SomeCheckBox&AnotherCheckbox, Path=IsChecked}"/>

¿Cuál es la mejor manera de hacerlo? No puedo evitar sentir que me estoy perdiendo algo obvio o estoy yendo por este camino equivocado.



Puede usar un MultiBinding con un convertidor que implementa IMultiValueConverter .

Solo para dar una respuesta puedes (casi) copiar y pegar:

Recurso estático necesario:

<converterNamespace:BooleanAndConverter x:Key="booleanAndConverter" />

El ComboBox:

<ComboBox Name="MyComboBox"> <ComboBox.IsEnabled> <MultiBinding Converter="{StaticResource booleanAndConverter}"> <Binding ElementName="SomeCheckBox" Path="IsChecked" /> <Binding ElementName="AnotherCheckbox" Path="IsChecked" /> </MultiBinding> </ComboBox.IsEnabled> </ComboBox>

El código para el convertidor:

namespace ConverterNamespace { public class BooleanAndConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { foreach (object value in values) { if ((value is bool) && (bool)value == false) { return false; } } return true; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotSupportedException("BooleanAndConverter is a OneWay converter."); } } }


También puedes probar una versión más corta de la misma:

public class BooleanAndConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return values.OfType<IConvertible>().All(System.Convert.ToBoolean); } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotSupportedException(); } } public class BooleanOrConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return values.OfType<IConvertible>().Any(System.Convert.ToBoolean); } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotSupportedException(); } }

y, por supuesto, también puede necesitar visibilidad para los convertidores:

public class BooleanOrToVisibilityConverter : IMultiValueConverter { public Visibility HiddenVisibility { get; set; } public bool IsInverted { get; set; } public BooleanOrToVisibilityConverter() { HiddenVisibility = Visibility.Collapsed; IsInverted = false; } public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { bool flag = values.OfType<IConvertible>().Any(System.Convert.ToBoolean); if (IsInverted) flag = !flag; return flag ? Visibility.Visible : HiddenVisibility; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class BooleanAndToVisibilityConverter : IMultiValueConverter { public Visibility HiddenVisibility { get; set; } public bool IsInverted { get; set; } public BooleanAndToVisibilityConverter() { HiddenVisibility = Visibility.Collapsed; IsInverted = false; } public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { bool flag = values.OfType<IConvertible>().All(System.Convert.ToBoolean); if (IsInverted) flag = !flag; return flag ? Visibility.Visible : HiddenVisibility; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }