当界面上出现多组Radiobutton时,将所有的Radiobutton写在同一个Grid里面,导致系统认为所有的Radiobutton是同一组,造成选择混乱,解决的方法:
1.要为属于同个组的Radiobutton设置相同的GroupName,绑定同一个变量;
2.若没有为Radiobutton设置GroupName,则将属于同一组的Radiobutton放在一个容器中,如wrappannel里面。
通常为Radiobutton设置转化器,将不同的button上对应的值,与选中与不选中进行转换,下面展示例子,示例中有三种转换器:EnumToBoolConverter,IntToBoolConverter,FloatToBoolConverter。代码如下(示例采用的MVVM模式):
///model中代码
public enumProtocolTypeDefine { RS232, RS485 } privateProtocolTypeDefine _protocolType; private int_dataBits; private float_stopBits; /// <summary> ///协议类型 /// </summary> publicProtocolTypeDefine ProtocolType { get{ return_protocolType; } set{ _protocolType =value; RaisePropertyChanged( ()=>ProtocolType ); } } /// <summary> ///数据位 /// </summary> public intDataBits { get{ return_dataBits; } set{ _dataBits =value; RaisePropertyChanged( ()=>DataBits ); } } /// <summary> ///停止位 /// </summary> public floatStopBits { get{ return_stopBits; } set{ _stopBits =value; RaisePropertyChanged( ()=>StopBits ); } }
//view.xaml中代码
<UserControl.Resources> <local:IntToBoolConverter x:Key="IntToBoolConverter"></local:IntToBoolConverter> <local:FloatToBoolConverter x:Key="FloatToBoolConverter"></local:FloatToBoolConverter> <local:EnumToBoolConverter x:Key="EnumToBoolConverter"></local:EnumToBoolConverter> </UserControl.Resources> <RadioButton Grid.Row="0"Grid.Column="0"Content="RS232"IsChecked="{Binding SerialSetModel.ProtocolType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter= 0 }"HorizontalAlignment="Left"VerticalAlignment="Center"/> <RadioButton Grid.Row="0"Grid.Column="1"Content="RS485"IsChecked="{Binding SerialSetModel.ProtocolType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter= 1 }"HorizontalAlignment="Left"VerticalAlignment="Center"/> <RadioButton Grid.Row="2"Grid.Column="1"GroupName="DataBits"Content="6"IsChecked="{Binding SerialSetModel.DataBits, Converter ={StaticResource IntToBoolConverter}, ConverterParameter= 6}"></RadioButton> <RadioButton Grid.Row="2"Grid.Column="2"GroupName="DataBits"Content="7"IsChecked="{Binding SerialSetModel.DataBits, Converter ={StaticResource IntToBoolConverter}, ConverterParameter= 7}"></RadioButton> <RadioButton Grid.Row="2"Grid.Column="3"GroupName="DataBits"Content="8"IsChecked="{Binding SerialSetModel.DataBits, Converter ={StaticResource IntToBoolConverter}, ConverterParameter= 8}"></RadioButton> <TextBlock Grid.Row="3"Grid.Column="0"Text="停止位:"></TextBlock> <RadioButton Grid.Row="3"Grid.Column="1"GroupName="StopBits"Content="1"IsChecked="{Binding SerialSetModel.StopBits, Converter={StaticResource FloatToBoolConverter},ConverterParameter= 1}"></RadioButton> <RadioButton Grid.Row="3"Grid.Column="2"GroupName="StopBits"Content="1.5"IsChecked="{Binding SerialSetModel.StopBits, Converter={StaticResource FloatToBoolConverter},ConverterParameter= 1.5}"></RadioButton> <RadioButton Grid.Row="3"Grid.Column="3"GroupName="StopBits"Content="2"IsChecked="{Binding SerialSetModel.StopBits, Converter={StaticResource FloatToBoolConverter},ConverterParameter= 2}"></RadioButton>
//view.cs中的代码
public classEnumToBoolConverter : IValueConverter { public object Convert(object value, Type targetType, objectparameter, System.Globalization.CultureInfo culture) { int data = (int)value; string name =parameter.ToString(); switch(name) { case "0": return data == 0; case "1": return data == 1; default: return false; } } public object ConvertBack(object value, Type targetType, objectparameter, System.Globalization.CultureInfo culture) { return (ProtocolTypeDefine)int.Parse(parameter.ToString()); } } public classIntToBoolConverter : IValueConverter { public object Convert(object value, Type targetType, objectparameter, System.Globalization.CultureInfo culture) { int data = (int)value; string name =parameter.ToString(); switch(name) { case "6": return data == 6; case "7": return data == 7; case "8": return data == 8; default: return false; } } public object ConvertBack(object value, Type targetType, objectparameter, System.Globalization.CultureInfo culture) { var data = (bool)value; if(data) { returnSystem.Convert.ToInt32(parameter); } return -1; } } public classFloatToBoolConverter : IValueConverter { public object Convert(object value, Type targetType, objectparameter, System.Globalization.CultureInfo culture) { float data =0f; if (!float.TryParse(value.ToString(), outdata)) { return false; } string name =parameter.ToString(); switch(name) { case "1": return data == 1; case "1.5": return data == 1.5; case "2": return data == 2; default: return false; } } public object ConvertBack(object value, Type targetType, objectparameter, System.Globalization.CultureInfo culture) { var data = (bool)value; if(data) { returnSystem.Convert.ToSingle(parameter); } return -1; } }
//model中代码
//协议 SerialSetModel.ProtocolType = 0; //数据位 SerialSetModel.DataBits = 8; //停止位 SerialSetModel.StopBits = 1;
在此只贴出重要部分代码,使用时只要按照该原理进行组装即可。