65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (31投票s)

2014年2月3日

Ms-PL

2分钟阅读

viewsIcon

169927

downloadIcon

4381

描述了将一组单选按钮绑定到单个属性的方法,无论属性类型如何(枚举、布尔值、整数、字符串)。

引言

在构建诸如选项对话框之类的用户界面时,您可能希望使用一组单选按钮来表示布尔值、枚举,有时甚至是整数或字符串属性。

背景

我做了一些研究,发现了很多关于如何使用转换器来做到这一点的文章。然而,大多数解决方案都过于繁琐,是为特定类型构建的,并且存在很长的提问/问题线程。

这是我找到的最全面的帖子: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;
    }
}

请注意,此解决方案不适用于标志枚举属性(例如,您希望将一组复选框绑定到单个属性)。您可以在上面背景部分引用的文章中找到标志枚举类型的解决方案。

历史

初始发布。

© . All rights reserved.