как привязать логическое значение к combobox в wpf
Ну, мне было интересно, как привязать логическое свойство к combobox.Combobox будет Да / нет combobox.
4 ответов
вы можете использовать ValueConverter для преобразования логического значения в индекс ComboBox и обратно. Вот так:
public class BoolToIndexConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value == true) ? 0 : 1;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((int)value == 0) ? true : false;
}
}
}
предполагая, что да находится на индексе 0 и нет на индексе 1. Тогда вам придется использовать этот конвертер в привязке к свойству SelectedIndex. Для этого вы объявляете свой конвертер в разделе ресурсов:
<Window.Resources>
<local:BoolToIndexConverter x:Key="boolToIndexConverter" />
</Window.Resources>
затем вы используете его в своей привязке:
<ComboBox SelectedIndex="{Binding YourBooleanProperty, Converter={StaticResource boolToIndexConverter}}"/>
первое решение-заменить ваше поле со списком "Да/нет" флажком, потому что, ну, флажок существует по какой-то причине.
второе решение-заполнить combobox объектами true и false, а затем привязать "SelectedItem" вашего combobox к вашему логическому свойству.
Я обнаружил, что использую свойство IsSelected элементов ComboBox для этого в прошлом. Этот метод полностью находится в xaml.
<ComboBox>
<ComboBoxItem Content="No" />
<ComboBoxItem Content="Yes" IsSelected="{Binding YourBooleanProperty, Mode=OneWayToSource}" />
</ComboBox>
вот пример (заменить enabled / disabled на yes/no):
<ComboBox SelectedValue="{Binding IsEnabled}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={x:Static converters:EnabledDisabledToBooleanConverter.Instance}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.Items>
<system:Boolean>True</system:Boolean>
<system:Boolean>False</system:Boolean>
</ComboBox.Items>
</ComboBox>
вот конвертер:
public class EnabledDisabledToBooleanConverter : IValueConverter
{
private const string EnabledText = "Enabled";
private const string DisabledText = "Disabled";
public static readonly EnabledDisabledToBooleanConverter Instance = new EnabledDisabledToBooleanConverter();
private EnabledDisabledToBooleanConverter()
{
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Equals(true, value)
? EnabledText
: DisabledText;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//Actually won't be used, but in case you need that
return Equals(value, EnabledText);
}
}
и не нужно играть с индексами.