在WinForms中数据绑定一组单选按钮的最佳方式 [英] Best way to databind a group of radiobuttons in WinForms

查看:184
本文介绍了在WinForms中数据绑定一组单选按钮的最佳方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究数据绑定我现有的一些Windows窗体,我遇到了一个问题,找出了在一个组框内数据绑定一组单选按钮控件的正确方法。



我的业务对象有一个整数属性,我想对4个单选按钮进行数据绑定(其中每个单元都代表值0 - 3)。



我目前正在绑定一个演示者对象,它作为表单和业务对象之间的绑定,现在我已经完成的方式是拥有4个独立的属性,每个属性都绑定到这些值(我使用INotifyPropertyChanged ,但不包括在这里):

 私有int _propValue; 

公共bool PropIsValue0
{
get {return _propValue == 0; }
set
{
if(value)
_propValue = 0;
}
}

公共bool PropIsValue1 {//如上,但值为== 1}
公共bool PropIsValue2 {//如上所述,但具有值== 2}
公共bool PropIsValue3 {//如上,但值为== 3}

然后我将每个单选按钮绑定到上面的各自的属性。



这对我来说似乎不对,所以任何建议都非常感激。 p>

解决方案

以下是ArielBH建议的一个通用的RadioGroupBox实现(一些代码从Jay Andrew Allen的 RadioPanel )。只需添加RadioButtons,将其标签设置为不同的整数,并绑定到Selected属性。

  public class RadioGroupBox:GroupBox 
{
public event EventHandler SelectedChanged = delegate {};

int _selected;
public int Selected
{
get
{
return _selected;
}
set
{
int val = 0;
var radioButton = this.Controls.OfType< RadioButton>()
.FirstOrDefault(radio =>
radio.Tag!= null
&& int.TryParse radio.Tag.ToString(),out val)&& val == value);

if(radioButton!= null)
{
radioButton.Checked = true;
_selected = val;
}
}
}

protected override void OnControlAdded(ControlEventArgs e)
{
base.OnControlAdded(e);

var radioButton = e.Control as RadioButton;
if(radioButton!= null)
radioButton.CheckedChanged + = radioButton_CheckedChanged;
}

void radioButton_CheckedChanged(object sender,EventArgs e)
{
var radio =(RadioButton)sender;
int val = 0;
if(radio.Checked&& amp;& radio.Tag!= null
&& int.TryParse(radio.Tag.ToString(),out val))
{
_selected = val;
SelectedChanged(this,new EventArgs());
}
}
}

请注意,您不能由于InitializeComponent中的初始化顺序问题,绑定到Selected属性(绑定在单选按钮初始化之前执行,所以在第一个赋值中它们的标签为空)。所以就这样绑定你自己:

  public Form1()
{
InitializeComponent();
//假设selected1和selected2被定义为整数应用程序设置
radioGroup1.DataBindings.Add(Selected,Properties.Settings.Default,selected1);
radioGroup2.DataBindings.Add(Selected,Properties.Settings.Default,selected2);
}


I'm currently working on databinding some of my existing Windows Forms, and I've ran into an issue figuring out the proper way of databinding a group of radiobutton controls within a group box.

My business object has an integer property which I want to databind against 4 radiobuttons (where each of them represents the values 0 - 3).

I'm currently binding against a presenter object which works as the binder between the form and the business object, and the way I've done it now is to have 4 separate properties which each binds against each of these values (I do use INotifyPropertyChanged, but not including that here):

Private int _propValue;

Public bool PropIsValue0 
{ 
  get { return _propValue == 0; }
  set
  {
    if (value) 
      _propValue = 0;
  }
}

Public bool PropIsValue1 { // As above, but with value == 1 }
Public bool PropIsValue2 { // As above, but with value == 2 }
Public bool PropIsValue3 { // As above, but with value == 3 }

And I then bind each of the radiobuttons to their respective property as above.

This does not seem right to me, so any advice are highly appreciated.

解决方案

Following is a generic RadioGroupBox implementation in the spirit of ArielBH's suggestion (some code borrowed from Jay Andrew Allen's RadioPanel). Just add RadioButtons to it, set their tags to different integers and bind to the 'Selected' property.

public class RadioGroupBox : GroupBox
{
    public event EventHandler SelectedChanged = delegate { };

    int _selected;
    public int Selected
    {
        get
        {
            return _selected;
        }
        set
        {
            int val = 0;
            var radioButton = this.Controls.OfType<RadioButton>()
                .FirstOrDefault(radio =>
                    radio.Tag != null 
                   && int.TryParse(radio.Tag.ToString(), out val) && val == value);

            if (radioButton != null)
            {
                radioButton.Checked = true;
                _selected = val;
            }
        }
    }

    protected override void OnControlAdded(ControlEventArgs e)
    {
        base.OnControlAdded(e);

        var radioButton = e.Control as RadioButton;
        if (radioButton != null)
            radioButton.CheckedChanged += radioButton_CheckedChanged;
    }

    void radioButton_CheckedChanged(object sender, EventArgs e)
    {
        var radio = (RadioButton)sender;
        int val = 0;
        if (radio.Checked && radio.Tag != null 
             && int.TryParse(radio.Tag.ToString(), out val))
        {
            _selected = val;
            SelectedChanged(this, new EventArgs());
        }
    }
}

Note that you can't bind to the 'Selected' property via the designer due to initialization order problems in InitializeComponent (the binding is performed before the radio buttons are initialized, so their tag is null in the first assignment). So just bind yourself like so:

    public Form1()
    {
        InitializeComponent();
        //Assuming selected1 and selected2 are defined as integer application settings
        radioGroup1.DataBindings.Add("Selected", Properties.Settings.Default, "selected1");
        radioGroup2.DataBindings.Add("Selected", Properties.Settings.Default, "selected2");
    }

这篇关于在WinForms中数据绑定一组单选按钮的最佳方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆