當界面上出現多組Radiobutton時,將所有的Radiobutton寫在同一個Grid里面,導致系統認為所有的Radiobutton是同一組,造成選擇混亂,解決的方法:
1.要為屬於同個組的Radiobutton設置相同的GroupName,綁定同一個變量;
2.若沒有為Radiobutton設置GroupName,則將屬於同一組的Radiobutton放在一個容器中,如wrappannel里面。
通常為Radiobutton設置轉化器,將不同的button上對應的值,與選中與不選中進行轉換,下面展示例子,示例中有三種轉換器:EnumToBoolConverter,IntToBoolConverter,FloatToBoolConverter。代碼如下(示例采用的MVVM模式):
///model中代碼

1 public enum ProtocolTypeDefine 2 { 3 RS232, 4 RS485 5 } 6 private ProtocolTypeDefine _protocolType; 7 private int _dataBits; 8 private float _stopBits; 9 /// <summary> 10 /// 協議類型 11 // </summary> 12 public ProtocolTypeDefine ProtocolType 13 { 14 get 15 { 16 return _protocolType; 17 } 18 set 19 { 20 _protocolType = value; 21 RaisePropertyChanged( ()=>ProtocolType ); 22 } 23 } 24 25 /// <summary> 26 /// 數據位 27 /// </summary> 28 public int DataBits 29 { 30 get 31 { 32 return _dataBits; 33 } 34 set 35 { 36 _dataBits = value; 37 RaisePropertyChanged( ()=> DataBits ); 38 } 39 } 40 /// <summary> 41 /// 停止位 42 /// </summary> 43 public float StopBits 44 { 45 get 46 { 47 return _stopBits; 48 } 49 set 50 { 51 _stopBits = value; 52 RaisePropertyChanged( ()=>StopBits ); 53 } 54 }
//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> cs: public class EnumToBoolConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, 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, object parameter, System.Globalization.CultureInfo culture) { return (ProtocolTypeDefine)int.Parse(parameter.ToString()); } } public class IntToBoolConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, 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, object parameter, System.Globalization.CultureInfo culture) { var data = (bool)value; if (data) { return System.Convert.ToInt32(parameter); } return -1; } } public class FloatToBoolConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { float data = 0f; if (!float.TryParse(value.ToString(), out data)) { 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, object parameter, System.Globalization.CultureInfo culture) { var data = (bool)value; if (data) { return System.Convert.ToSingle(parameter); } return -1; } }
//model中代碼

//協議 SerialSetModel.ProtocolType = 0; //數據位 SerialSetModel.DataBits = 8; //停止位 SerialSetModel.StopBits = 1;
在此只貼出重要部分代碼,使用時只要按照該原理進行組裝即可。