как связать логическое значение с combobox в wpf - PullRequest
12 голосов
/ 02 декабря 2010

Ну, мне было интересно, как связать логическое свойство со списком. Комбобокс будет со списком да / нет.

Ответы [ 4 ]

20 голосов
/ 02 декабря 2010

Вы можете использовать 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}}"/>
11 голосов
/ 02 декабря 2010

Первое решение состоит в том, чтобы заменить ваш комбинированный список «Да / Нет» флажком, потому что, ну, в общем, флажок существует по причине.

Второе решение состоит в том, чтобы заполнить ваш комбинированный список истинными и ложными объектами, а затем связать«SelectedItem» вашего комбинированного списка в ваше логическое свойство.

10 голосов
/ 08 августа 2014

Я использовал это свойство IsSelected элементов ComboBox для этого в прошлом.Этот метод полностью в xaml.

<ComboBox>
    <ComboBoxItem Content="No" />
    <ComboBoxItem Content="Yes" IsSelected="{Binding YourBooleanProperty, Mode=OneWayToSource}" />
</ComboBox>
1 голос
/ 13 октября 2014

Вот пример (замена включена / отключена на да / нет):

<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);
    }
}

И не нужно играть с индексами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...