C#:数据绑定一个自定义类来形成控件(复选框?)

时间:2009-11-26 22:31:10

标签: c# .net data-binding checkbox bindingsource

我正在Visual Studio 2008 / C#中编写桌面应用程序

我(主要)完成了一个引擎,它为一家小公司制作了本周的工作时间表;一种课程安排问题的形式

现在我正在设计一个表单,用户可以在其中确定引擎要遵守的初始参数或标准(因为某些设置是可选的)

我有一个名为EngineParameters的类,它包含所有这些设置。

出于数据绑定的目的,我创建了一个 bndEngineParameters 类,它用getter和setter封装了所有相关字段

public class bndEngineParameters
    {
        private engineParameters _parameters;

        public bndEngineParameters(engineParameters ep)
        {
            this._parameters = ep;                
        }

        public bool avoidGrouping
        {
            get { return _parameters.avoidGrouping; }
            set { _parameters.avoidGrouping = value; }
        }

        public bool avoidWeekends
        {
            get { return _parameters.avoidWeekends; }
            set { _parameters.avoidWeekends = value; }

        }

        public bool keyFlow
        {
            get { return _parameters.keyFlow; }
            set { _parameters.keyFlow = value; }
        }

        public bool keyFlowAssistants
        {
            get { return _parameters.keyFlowAssistants; }
            set { _parameters.keyFlowAssistants = value; }
        }        
    }

它不完整 - 会有int值(一个可以工作的最大小时数等);我希望将这些bool值绑定到表单上的复选框

正是在这个微不足道的任务中,我惊奇地遇到了问题

使用“添加新数据源”向导,我创建了一个绑定源

private System.Windows.Forms.BindingSource bndEngineParametersBindingSource;

然后我将Checkbox的 Checked 属性绑定到我的绑定源的相应属性:

alt text

我实现了一个局部变量 boundParameters ,以便我可以访问用户设置的参数

  public partial class formGenerateRota : Form
    {

        public bndEngineParameters boundParameters;

        // (...)

        public formGenerateRota()
        {
            InitializeComponent();
        }        

        private void formGenerateRota_Load(object sender, EventArgs e)
        {
            boundParameters = new bndEngineParameters(new engineParameters());
            bndEngineParametersBindingSource.Add(boundParameters);            
        }

        // (...)
}

什么?什么都没发生。在 bndEngineParametersBindingSource.Current 下有一个bndEngineParameters对象(当然是在运行时),但 avoidWeekends 值永远不会改变(当我勾选复选框时),以及永远不会触发 bndEngineParametersBindingSource_CurrentItemChanged 事件

怎么了?


SORRY!它确实会改变,但只有在复选框失去焦点后(验证后)。

我有时候很蠢

如果我做错了什么(我对数据绑定没有任何帮助),如果你指出它,我会非常感激!

2 个答案:

答案 0 :(得分:4)

两个常见问题:

  • DataSourceUpdateMode设置为OnPropertyChanged
  • (可选)从对象接收更改,实施{name}Changed事件模式或INotifyPropertyChanged

说实话,我相信大部分都没有必要;你应该只能说:

myCheckbox.Bindings.Add("Checked", myEngineParameters, "avoidWeekends",
    false, DataSourceUpdateMode.OnPropertyChanged);

完整示例:

using System;
using System.Diagnostics;
using System.Windows.Forms;

class EngineParameters {
    private bool avoidWeekends;
    public bool AvoidWeekends {
        get { return avoidWeekends; }
        set {
            avoidWeekends = value;
            Debug.WriteLine("AvoidWeekends => " + value);
        }
    }
}
static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();            
        using(Form form = new Form())
        using (CheckBox myCheckbox = new CheckBox()) {
            EngineParameters myEngineParameters = new EngineParameters();
            myEngineParameters.AvoidWeekends = true;    
            form.Controls.Add(myCheckbox);
            myCheckbox.DataBindings.Add("Checked", myEngineParameters, "AvoidWeekends",
                false, DataSourceUpdateMode.OnPropertyChanged);
            Application.Run(form);
        }
    }
}

答案 1 :(得分:2)

而不是:

bndEngineParametersBindingSource.Add(boundParameters); 

这样做:

bndEngineParametersBindingSource.DataSource = boundParameters;