WPF的Radiobutton使用


当界面上出现多组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         }
Model Code

//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;
        }
    }
View Code

//model中代码

 //协议 
            SerialSetModel.ProtocolType = 0;
//数据位
            SerialSetModel.DataBits = 8;
 //停止位
            SerialSetModel.StopBits = 1;
View Code

在此只贴出重要部分代码,使用时只要按照该原理进行组装即可。

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM