Подтвердить что ты не робот

WPF Radiobutton (два) (привязка к логическому значению)

У меня есть свойство типа boolean, представленное с помощью флажка.

Я хочу изменить это на два радиообмена, которые связывают одно и то же свойство, представляющее значение true/false.

Как это можно сделать?

4b9b3361

Ответ 1

<RadioButton GroupName="Group1" 
             IsChecked="{Binding PropertyValue}" Content="Yes" />
<RadioButton GroupName="Group1"  Content="No" 
             IsChecked="{Binding PropertyValue, 
                         Converter={StaticResource BoolInverterConverter}}" />
public class BoolInverterConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !(bool)value;
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
        System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !(bool)value;
        }
        return value;
    }

    #endregion
}

Ответ 2

Вы можете использовать преобразователь значений, который возвращает логическое значение:

С помощью этого конвертера свяжите одно свойство Checkbox.IsChecked с логическим значением без конвертера и одним средством CheckBox.IsChecked с конвертером. Это должно сделать трюк.

Вот код для такого конвертера. Я скопировал его из здесь и добавил некоторые строки кода. Там вы найдете больше информации.

public class BoolToOppositeBoolConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture) {
        if (targetType != typeof(bool)) {
            throw new InvalidOperationException("The target must be a boolean");
        }
        if (null == value) {
            return null;
        }
                    return !(bool)value;
    }

    public object ConvertBack(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture) {
        if (targetType != typeof(bool)) {
            throw new InvalidOperationException("The target must be a boolean");
        }
        if (null == value) {
            return null;
        }
        return !(bool)value;
    }
} 

Чтобы использовать его, объявите его в разделе ресурсов.

 <local:BoolToOppositeBoolConverter x:Key="BoolToOppositeBoolConverter_ValueConverter"/>

И использовать его в привязке как статический ресурс:

<CheckBox IsChecked="{Binding YourProperty}" />
<CheckBox IsChecked="{Binding YourProperty,Converter={StaticResource BoolToOppositeBoolConverter_ValueConverter}}" />

Обратите внимание, что преобразователь - это всего лишь простой пример. Реализуйте его аккуратно, если вы хотите использовать его в продуктивном коде. Я его не тестировал. Сделайте комментарий, если он не работает.

Ответ 3

Стандартный метод привязки имеет неудачный побочный эффект при запуске установщика привязки как "невыбранный" всякий раз, когда пользовательский интерфейс загружается. Поэтому, если у вас есть код для обработки щелчков пользователя в настройщике для вашего bool, он будет делать какие-то странные вещи, такие как fire setter, "false", даже если вы привязали его к "истинному" bool.

Я обошел это с помощью конвертера, используемого специально для переключателей:

public class BoolRadioConverter : IValueConverter
{
    public bool Inverse { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool boolValue = (bool) value;

        return this.Inverse ? !boolValue : boolValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool boolValue = (bool)value;

        if (!boolValue)
        {
            // We only care when the user clicks a radio button to select it.
            return null;
        }

        return !this.Inverse;
    }
}

В ваших ресурсах:

<converters:BoolRadioConverter x:Key="BoolRadioConverter" />
<converters:BoolRadioConverter x:Key="InverseBoolRadioConverter" Inverse="True" />

В вашем xaml:

<RadioButton
    Content="True option"
    GroupName="radioGroup1"
    IsChecked="{Binding MyProperty,
                        Converter={StaticResource BoolRadioConverter}}" />
<RadioButton
    Content="False option"
    GroupName="radioGroup2"
    IsChecked="{Binding MyProperty,
                        Converter={StaticResource InverseBoolRadioConverter}}" />

Ответ 4

Вы можете достичь этого без конвертера, если вы установили для свойства GroupName два переключателя на одно и то же значение (поэтому в это время можно проверить только один). Затем установите IsChecked из одного переключателя на "True" и привяжите IsChecked другого к вашему логическому. Переключение переключателей изменит логическое значение, однако изменение логического значения на False не будет проверять другой переключатель.

Спасибо, Влад

Ответ 6

Упрощенная версия ragunathan .

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) =>
    Convert(value);

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) =>
    Convert(value);

private object Convert(object value) => 
    value is bool ? !(bool)value : value;