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

查看:22
本文介绍了在 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 个单选按钮进行数据绑定(其中每个按钮代表 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.

这对我来说似乎不对,所以非常感谢任何建议.

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

推荐答案

以下是本着 ArielBH 建议精神的通用 RadioGroupBox 实现(一些代码从 Jay Andrew Allen 的 RadioPanel).只需向其中添加 RadioButton,将它们的标签设置为不同的整数并绑定到 'Selected' 属性.

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 中的初始化顺序问题,您无法通过设计器绑定到 'Selected' 属性(绑定是在初始化单选按钮之前执行的,因此它们的标记在第一次赋值中为空).所以就这样绑定自己:

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