我有一个boolean类型的属性,带有复选框。
我想将其更改为绑定在同一属性上的两个radiobutton,其值为true / false。
怎么办呢?
答案 0 :(得分:73)
<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
}
答案 1 :(得分:9)
您可以使用恢复布尔值的值转换器:
使用该转换器,将一个Checkbox.IsChecked属性绑定到没有转换器的布尔值和一个带转换器的CheckBox.IsChecked属性。这应该可以解决问题。
这里是这种转换器的代码。我从here复制了它并添加了一些代码行。在那里你会找到更多关于。
的信息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}}" />
请注意,转换器只是一个简单的例子。如果要在生产代码中使用它,请巧妙地实现它。我没有测试过。如果它不起作用,请发表评论。
答案 2 :(得分:7)
标准绑定方法具有解雇绑定设置器的不幸副作用,因为&#34;未选择&#34;每当加载UI时。因此,如果你有代码来处理用户在你的bool的setter中的点击次数,那么它会做一些奇怪的事情,例如将setter发送到&#34; false&#34;即使你已经把它绑定到了一个真实的&#34;布尔。
我使用专门用于单选按钮的转换器解决了这个问题:
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}}" />
答案 3 :(得分:3)
如果将两个单选按钮的GroupName属性设置为相同的值(因此当时只能检查一个),则可以在没有转换器的情况下实现此目的。然后,将一个单选按钮的IsChecked设置为“True”,并将另一个单独的IsChecked绑定到您的布尔值。切换单选按钮将更改布尔值,但是,将布尔值更改为False将不会检查其他单选按钮。
谢谢, 弗拉德
答案 4 :(得分:2)
以下是如何使用示例代码将单选按钮绑定到任何类型(枚举,布尔,字符串,整数等)的解决方案:
http://www.codeproject.com/Tips/720497/Binding-Radio-Buttons-to-a-Single-Property
答案 5 :(得分:1)
在使用MVVMLight
且在{strong> XAML 中将DataContext
设置为:
DataContext="{Binding <Your ViewModel property name>, Source={StaticResource Locator}}"
BoolInverterConverter
导致Stack Overflow
第二次打开窗口。
解决方法是从XAML中删除DataContext
,并在InitializeComponent()
之后在窗口构造函数中的代码中完成该操作:
DataContext = ServiceLocator.Current.GetInstance<Your View Model class>();
经过一些测试后还不够-单击单选按钮时,可能会随机弹出堆栈溢出错误。对我有用的解决方案-代替转换器,为组中的其他单选按钮使用另一个属性:
public bool Is9to1 { get; set; }
public bool Is1to9 { get { return !Is9to1; } set { Is9to1 = !value; } }
在XAML中:
<RadioButton GroupName="Is9to1" IsChecked="{Binding Is1to9}"/>
<RadioButton GroupName="Is9to1" IsChecked="{Binding Is9to1}"/>
答案 6 :(得分:0)
简体版ragunathan的answer。
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;
答案 7 :(得分:0)
如果您希望布尔值可为空(无默认值/选中的单选按钮),则对RandomEngy答案的升级很小
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 != null && (bool)!boolValue)
{
// We only care when the user clicks a radio button to select it.
return null;
}
return !this.Inverse;
}
}
其余的与他的答案相同。