C #: данные, привязывающие отдельный пользовательский класс к элементам управления формы (флажок?) - PullRequest
3 голосов
/ 27 ноября 2009

Я пишу настольное приложение в Visual Studio 2008 / C #

Я закончил (в основном) написание движка, который генерирует график работы на неделю для небольшой компании; форма задачи планирования курса

Прямо сейчас я разрабатываю форму, в которой пользователь может определить начальные параметры или критерии, которым должен следовать движок (так как некоторые настройки являются необязательными)

У меня есть класс с именем EngineParameters, который содержит все эти настройки.

Для привязки данных я создал класс 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 моего флажка с соответствующим свойством моего источника привязки:

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, но значение avoWeekends никогда не меняется (когда я включаю и выключаю флажок), а bndEngineParametersBindingSource_CurrentItemChanged событие никогда не запускается

Что не так?


SORRY! оно меняется, но только после того, как флажок теряет фокус (после проверки).

иногда я тупой

Если я все равно что-то не так делаю (я не очень хорошо разбираюсь в данных), я был бы очень признателен, если бы вы указали на это, конечно!

Ответы [ 2 ]

4 голосов
/ 27 ноября 2009

Две общие проблемы:

  • установите 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);
        }
    }
}
2 голосов
/ 27 ноября 2009

Вместо этого:

bndEngineParametersBindingSource.Add(boundParameters); 

сделать это:

bndEngineParametersBindingSource.DataSource = boundParameters; 
...