我正在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 属性绑定到我的绑定源的相应属性:
我实现了一个局部变量 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!它确实会改变,但只有在复选框失去焦点后(验证后)。
我有时候很蠢
如果我做错了什么(我对数据绑定没有任何帮助),如果你指出它,我会非常感激!
答案 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;