将单选按钮绑定到单个属性






4.93/5 (31投票s)
描述了将一组单选按钮绑定到单个属性的方法,无论属性类型如何(枚举、布尔值、整数、字符串)。
引言
在构建诸如选项对话框之类的用户界面时,您可能希望使用一组单选按钮来表示布尔值、枚举,有时甚至是整数或字符串属性。
背景
我做了一些研究,发现了很多关于如何使用转换器来做到这一点的文章。然而,大多数解决方案都过于繁琐,是为特定类型构建的,并且存在很长的提问/问题线程。
这是我找到的最全面的帖子:http://stackoverflow.com/a/2908885/2005727。这个解决方案受该帖子启发,我想进一步提供一个完整的代码示例。
解决方案
您需要使用转换器参数来指定单选按钮对应的值。如果您的属性等于此值,则该按钮将被选中,其他按钮将被取消选中。此解决方案无论您是否设置 GroupName 属性都有效,尽管您通常应该设置它。
以下是在 XAML 中为布尔属性执行此操作的示例
<RadioButton GroupName="BooleanGroup"
IsChecked="{Binding BoolProperty, Converter={StaticResource RadioButtonCheckedConverter},
ConverterParameter={x:Static src:MainWindow.BooleanTrue}}">
</RadioButton>
<RadioButton GroupName="BooleanGroup"
IsChecked="{Binding BoolProperty, Converter={StaticResource RadioButtonCheckedConverter},
ConverterParameter={x:Static src:MainWindow.BooleanFalse}}">
</RadioButton>
请注意,我在我的类中定义了两个静态布尔成员,以便我可以在 XAML 中使用静态绑定。或者,您可以以一种不太简洁的方式设置转换器参数,如这里所述:http://stackoverflow.com/questions/3978937/how-to-pass-an-integer-as-converterparameter。
另一种有趣的方法是使用资源而不是静态绑定,正如讨论的这里:http://stackoverflow.com/questions/4997446/boolean-commandparameter-in-xaml。
<Application.Resources>
<system:Boolean x:Key="True">True</system:Boolean>
<system:Boolean x:Key="False">False</system:Boolean>
</Application.Resources>
<RadioButton GroupName="BooleanGroup"
IsChecked="{Binding BoolProperty, Converter={StaticResource RadioButtonCheckedConverter},
ConverterParameter={StaticResource True}}">
</RadioButton>
<RadioButton GroupName="BooleanGroup"
IsChecked="{Binding BoolProperty, Converter={StaticResource RadioButtonCheckedConverter},
ConverterParameter={StaticResource False}}">
</RadioButton>
以下是枚举的示例
<RadioButton GroupName="EnumGroup"
IsChecked="{Binding EnumProperty, Converter={StaticResource RadioButtonCheckedConverter},
ConverterParameter={x:Static src:TestEnum.Option1}}">
</RadioButton>
<RadioButton GroupName="EnumGroup"
IsChecked="{Binding EnumProperty, Converter={StaticResource RadioButtonCheckedConverter},
ConverterParameter={x:Static src:TestEnum.Option2}}">
</RadioButton>
<RadioButton GroupName="EnumGroup"
IsChecked="{Binding EnumProperty, Converter={StaticResource RadioButtonCheckedConverter},
ConverterParameter={x:Static src:TestEnum.Option3}}">
</RadioButton>
相同的方法可以应用于字符串和整数属性。以下是转换器的代码,无论属性类型如何,它都是相同的
public class RadioButtonCheckedConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return value.Equals(true) ? parameter : Binding.DoNothing;
}
}
请注意,此解决方案不适用于标志枚举属性(例如,您希望将一组复选框绑定到单个属性)。您可以在上面背景部分引用的文章中找到标志枚举类型的解决方案。
历史
初始发布。