C#: привязка данных к одному пользовательскому классу для формирования элементов управления (флажок?)
Я пишу настольное приложение в Visual Studio 2008 / C#
Я закончил (в основном) писать движок, который генерирует рабочий график на неделю для небольшой компании; форма задачи планирования курса
Прямо сейчас я разрабатываю форму, в которой пользователь может определить начальные параметры или критерии, которых должен придерживаться движок (поскольку некоторые настройки необязательны)
У меня есть класс с именем Engineerparameters, который содержит все эти настройки.
Для с целью привязки данных я создал класс bndEngineParameters , который инкапсулирует все соответствующие поля с геттерами и сеттерами
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;
Я тогда привязал свойство Checked моего Checkbox к соответствующему свойству моего источника привязки:
Alt текст http://i49.tinypic.com/muyhhi.jpg
Я реализовал локальную переменную 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);
}
// (...)
}
И что? Ничего не происходит. Существует объект bndEngineParameters под bndEngineParametersBindingSource.Текущий (во время выполнения, конечно), но avoidWeekends значение никогда не изменяется (когда я устанавливаю флажок ВКЛ. и выкл.), а событие bndEngineParametersBindingSource_currentitemchanged никогда не запускается
Что случилось?
Извините! он меняется, но только после того, как флажок теряет фокус (после проверки).
Иногда я веду себя глупо
Если я все равно делаю что-то не так (я не очень хорошо справляюсь с привязкой данных), я был бы очень признателен, если бы вы указали на это, конечно!
2 ответов:
Две общие проблемы:
- установите
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); } } }
Вместо этого:
bndEngineParametersBindingSource.Add(boundParameters);Сделайте так:
bndEngineParametersBindingSource.DataSource = boundParameters;
Comments