WPF中RadioButton的分組


當界面上出現多組Radiobutton時,將所有的Radiobutton寫在同一個Grid里面,導致系統認為所有的Radiobutton是同一組,造成選擇混亂,解決的方法:

1.要為屬於同個組的Radiobutton設置相同的GroupName,綁定同一個變量;

2.若沒有為Radiobutton設置GroupName,則將屬於同一組的Radiobutton放在一個容器中,如wrappannel里面。

通常為Radiobutton設置轉化器,將不同的button上對應的值,與選中與不選中進行轉換,下面展示例子,示例中有三種轉換器:EnumToBoolConverter,IntToBoolConverter,FloatToBoolConverter。代碼如下(示例采用的MVVM模式):

///model中代碼

       public enum ProtocolTypeDefine
        {
            RS232,            
            RS485            
        }

        private ProtocolTypeDefine _protocolType;
        private int _dataBits;    
        private float _stopBits;
        /// <summary>
        /// 協議類型
        /// </summary>
        public ProtocolTypeDefine ProtocolType
        {
            get
            {
                return _protocolType;
            }
            set
            {
                _protocolType = value;
               RaisePropertyChanged( ()=>ProtocolType );
            }
        }

        /// <summary>
        /// 數據位
        /// </summary>
        public int DataBits
        {
            get
            {
                return _dataBits;
            }
            set
            {
                _dataBits = value;
               RaisePropertyChanged( ()=> DataBits );
            }
        }
        /// <summary>
        /// 停止位
        /// </summary>
        public float StopBits
        {
            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 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;

 

在此只貼出重要部分代碼,使用時只要按照該原理進行組裝即可。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM