У меня есть свойство типа boolean, представленное с помощью флажка.
Я хочу изменить это на два радиообмена, которые связывают одно и то же свойство, представляющее значение true/false.
Как это можно сделать?
У меня есть свойство типа boolean, представленное с помощью флажка.
Я хочу изменить это на два радиообмена, которые связывают одно и то же свойство, представляющее значение true/false.
Как это можно сделать?
<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
}
Вы можете использовать преобразователь значений, который возвращает логическое значение:
С помощью этого конвертера свяжите одно свойство 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}}" />
Обратите внимание, что преобразователь - это всего лишь простой пример. Реализуйте его аккуратно, если вы хотите использовать его в продуктивном коде. Я его не тестировал. Сделайте комментарий, если он не работает.
Стандартный метод привязки имеет неудачный побочный эффект при запуске установщика привязки как "невыбранный" всякий раз, когда пользовательский интерфейс загружается. Поэтому, если у вас есть код для обработки щелчков пользователя в настройщике для вашего 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}}" />
Вы можете достичь этого без конвертера, если вы установили для свойства GroupName два переключателя на одно и то же значение (поэтому в это время можно проверить только один). Затем установите IsChecked из одного переключателя на "True" и привяжите IsChecked другого к вашему логическому. Переключение переключателей изменит логическое значение, однако изменение логического значения на False не будет проверять другой переключатель.
Спасибо, Влад
Вот решение о том, как привязывать радиокнопки к любому типу (перечисление, логическое, строковое, целочисленное и т.д.) с примером кода:
http://www.codeproject.com/Tips/720497/Binding-Radio-Buttons-to-a-Single-Property
Упрощенная версия 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;