привязка к переключателю - PullRequest
2 голосов
/ 15 июля 2011

У меня есть следующий переключатель, связанный с переменной IsAllowed

<RadioButton Name="YesRadioButton" Margin="5,5,0,0" IsChecked="{Binding Path=IsAllowed, Mode=TwoWay}">Yes</RadioButton>

Как заставить кнопку Нет принимать противоположное значение только с использованием XAML?

Ответы [ 4 ]

4 голосов
/ 15 июля 2011

Вам не нужно.Это произойдет по умолчанию.

Просто убедитесь, что IsAllowed начинается с true, а остальные позаботятся о себе.

Это потому, что при нажатии наКнопка No, она автоматически установит проверенное значение кнопки Yes (именно так работают переключатели), поэтому изменение произойдет автоматически, и ваш класс поддержки будет обновлен.

ДАЖЕ ЛУЧШЕ: Просто используйтефлажокДа / нет ситуации - это то, для чего они предназначены.

3 голосов
/ 15 июля 2011

Не существует решения только для Xaml.Вы можете связать Нет, используя конвертер обратного булла, хотя.

1 голос
/ 27 апреля 2012

Приведенный выше ответ работает, но я хотел преобразователь, который бы применялся к переключателям «Да» и «Нет» и отражал значение логических значений, допускающих значение Nullable.Поэтому я выбрал альтернативу, использующую преимущества параметров конвертера:

public class YesNoRadioButtonToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return CompareValueWithRequiredValueToBeChecked(value, parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return CompareValueWithRequiredValueToBeChecked(value, parameter);
    }

    private bool CompareValueWithRequiredValueToBeChecked(object value, object parameterValue)
    {
        bool? convertedValue = ConvertObjectToBool(value);
        bool? convertedParameter = ConvertObjectToBool(parameterValue);

        bool result = convertedValue == convertedParameter;

        return result;
    }

    private bool? ConvertObjectToBool(object parameter)
    {
        string stringResult = parameter == null ? null : parameter.ToString();
        bool? convertedResult;

        bool convertResultTest = false;
        if (stringResult != null && !bool.TryParse(stringResult, out convertResultTest))
        {
            throw new InvalidCastException(string.Format("Cannot convert {0} to a bool.", parameter));
        }

        convertedResult = stringResult == null ? (bool?)null : (bool?)convertResultTest;

        return convertedResult;
    }
}

Вот как выглядит XAML:

    <converters:YesNoRadioButtonToBooleanConverter x:Key="yesNoToBool" />

    <RadioButton Content="Yes" Name="radYes" GroupName="Group1" IsChecked="{Binding Path=boolProperty1, Mode=TwoWay, Converter={StaticResource yesNoToBool}, ConverterParameter=true}" />
    <RadioButton Content="No" Name="radNo" GroupName="Group1" IsChecked="{Binding Path=boolProperty1, Mode=TwoWay, Converter={StaticResource yesNoToBool}, ConverterParameter=false}" />
1 голос
/ 15 июля 2011

Вам нужно написать конвертер, используя IValueConverter .Вот пример, как это сделать WPF - привязать к противоположному логическому значению с помощью конвертера

...