VS2008 Двухстороннее связывание данных: как заставить его работать? - PullRequest
1 голос
/ 06 мая 2009

Я немного застрял, играя с DataBinding в пробном проекте. У меня есть простая форма с только spinbox, которую я хочу привязать к члену формы.

class Form1 {
    public class Data : System.ComponentModel.INotifyPropertyChanged {
        int _value = 10;
        public int value {get;set;}
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    }

    public Data data; // the member I want to bind to

}

В VS IDE раздел «Данные» в окне «Свойства моего прокрутки» позволяет мне выбрать Form1.data в качестве источника данных, но

  1. spinbox не инициализируется с 10, как я ожидал
  2. изменение значения spinbox не вызывает получение / набор Data.value.

И я просто не могу с этим жить. Есть идеи?

1 Ответ

1 голос
/ 06 мая 2009

Для object => управляющих обновлений: ваше событие не будет возбуждено - автоматически реализованные свойства не заботятся о INotifyPropertyChanged - вам нужно его убрать:

public class Data : INotifyPropertyChanged {
    int _value = 10;
    public int Value {
        get {return _value;}
        set {
            if(value != _value) {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
    protected virtual void OnPropertyChanged(string propertyName) {
         var handler = PropertyChanged;
         if(handler != null) {
              handler(this, new PropertyChangedEventArgs(propertyName));
         }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

Но для другого (control => object) я полагаю, что вы не правильно настроили привязку. Вам следует связать свойство Data.Value, и вам нужно будет рассказать ему о своем экземпляре Data во время выполнения:

  someBindingSource.DataSource = data;

Или, если вы используете DataBindings напрямую - это показывает, что он работает с указанным выше типом:

static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();

        Data data = new Data();
        data.PropertyChanged += delegate {
            Debug.WriteLine("Value changed: " + data.Value);
        };
        Button btn;
        NumericUpDown nud;
        Form form = new Form {
            Controls = {
                (nud = new NumericUpDown()),
                (btn = new Button {
                    Text = "Obj->Control",
                    Dock = DockStyle.Bottom })
            }
        };
        nud.DataBindings.Add("Value", data, "Value",
                       false, DataSourceUpdateMode.OnPropertyChanged);
        btn.Click += delegate { data.Value++; };
        Application.Run(form);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...