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

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

问题描述

我目前正在对数据绑定我的一些现有的Windows窗体,我已经碰到了一个问题搞清楚数据绑定组合框中的一组单选按钮控件的正确方法。

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.

我的业务对象,我想对数据绑定4单选按钮(如果他们每个人重新presents值0 - 3)整数属性。

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

我目前正在对一个presenter对象,它的工作原理的形式和业务对象,而我现在已经做了它的方式之间的粘合剂结合是有4个独立的特性,每个绑定针锋相对的这些值(我使用INotifyPropertyChanged的,但不包括在这里):

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.

这似乎不是我的权利,所以任何意见是高度AP preciated。

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

推荐答案

以下是在ArielBH的建议(一些code杰伊安德鲁·艾伦的的 RadioPanel )。只需添加单选按钮将它设置他们的标签不同的整数并绑定到选属性。

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());
        }
    }
}

请注意,你不能绑定到通过设计师选定财产因的InitializeComponent初始化顺序问题(单选按钮被初始化之前执行的约束力,所以他们的标签在第一项任务为空)。因此,只要结合自己像这样:

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天全站免登陆