none
[WinForms] Не могу понять не срабатывает биндинг RRS feed

  • Вопрос

  • Создал компонент. Как было сказано в мсдн прикрутил INotifyPropertyChanged, разместил компонент на форме через дизайнер задал связывание (на другой стороне тип тоже int), и обнаружилась проблема. информация при установке связывания в мой объект поступает. А когда изменяю StoreID в обратную сторону binding не срабатывает. Похоже, что-то я не учел. Помогите.
    public class textboxbutton : UserControl,INotifyPropertyChanged
    {
        private int _StoreID;
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        [Browsable(true),Bindable(true),DefaultValue(-1)]
        public int StoredID
        {
          get
          {
          	return _StoreID;
          }
          set
          {
          	_StoreID = value;
            NotifyPropertyChanged("StoredID");
          }
        }
    
    
        private void NotifyPropertyChanged(String info)
        {
          if (PropertyChanged != null)
          {
            PropertyChanged(this, new  PropertyChangedEventArgs(info));
          }
        } 
    } 
    

    Truth me,just me. (c) Kaa
    24 ноября 2010 г. 17:36

Ответы

  • У меня просто нет слов. Таких слов, которые описывают мои чувства даже в русском мате нет. Оказывается, по умолчанию связь которую устанавливает студия обновляется по событию onvalidate, а не по событию onpropertychange. А так как компонент у меня самописный и поле по которому я связываю тоже самописное. Идет такой косяк.

     

    Как только поставил в закладке databinding-advanced  в свойствах связи обновлять по событию onpropertychange все заработало как надо.

     

    З.Ы.Ж. И ведь самое обидное, такую мелкую деталь и нигде не описали.

     

     


    Truth me,just me. (c) Kaa
    • Помечено в качестве ответа Crusnik 3 декабря 2010 г. 15:43
    3 декабря 2010 г. 15:42

Все ответы

  • Проверьте, что в Binding установлен режим TwoWay:

     

    {Binding StoreID, Mode=TwoWay}

    25 ноября 2010 г. 8:16
  • Попробуйте так:

    на форме есть dataGridView, в котором будет отображатся информация о textboxbutton, и кнопка по которой будет изменятся свойство StoredID

      public partial class Form1 : Form
      {
        textboxbutton txb = new textboxbutton();
        BindingSource bs = new BindingSource();
    
        public Form1()
        {
          InitializeComponent();
    
          txb.Size = new Size(200, 200);
          txb.Location = new Point(300, 300);
          txb.BackColor = Color.Black;
          this.Controls.Add(txb);
    
          bs.DataSource = txb;
          dataGridView1.DataSource = bs;
        }
    
        public class textboxbutton : UserControl, INotifyPropertyChanged
        {
          private int _StoreID;
    
          public event PropertyChangedEventHandler PropertyChanged;
    
          [Browsable(true), Bindable(true), DefaultValue(-1)]
          public int StoredID
          {
            get
            {
              return _StoreID;
            }
            set
            {
              _StoreID = value;
              NotifyPropertyChanged("StoredID");
            }
          }
    
    
          private void NotifyPropertyChanged(String info)
          {
            if (PropertyChanged != null)
            {
              PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
          }
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
          txb.StoredID = 9;
        }
      }
    


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 29 ноября 2010 г. 23:14
    • Снята пометка об ответе Abolmasov Dmitry 1 декабря 2010 г. 17:09
    25 ноября 2010 г. 9:26
  • А поподробней если можно, а то я биндинге, и связанных с ним вопросах шарю совсем слабо. Как в winforms задать этот режим, при условии установки связывания через дизайнер. И если можно ссылочку или отсылку книжке где об этом можно почитать?


    Truth me,just me. (c) Kaa
    1 декабря 2010 г. 16:32
  • С одной стороны мой компонент textboxbutton с другой  objectbinder из библиотеки BLToolkit 

    В дополнении для тестирования сделал еще одно поле текстбокс и для него задал связь.

    В дизайнере Получилось две связки:

    textboxtutton.storeid  (int)           --->  objectbinder.КлючВалюта (int) 

    objectbinder.КлючВалюта (int)    --->  textbox.text  (string)

    Попробовал.

    Меняю первый раз (storeid=1). Ничего не происходит.

    Меняю второй раз (storeid=2).  В поле ключвалюта и в  textbox  появляется значение "1".

     

    Где косяк, не понимаю.... Пожалуйста спасите.....


    Truth me,just me. (c) Kaa
    1 декабря 2010 г. 16:57
  • Делайте привязку в коде

    У нас есть objectbinder из библиотеки BLToolkit , textbox и textboxtutton.

    Связываем:

                objectBinder1.Object = textboxbutton1;

                label1.DataBindings.Add(new Binding("Text", objectBinder1, "StoredID"));

                textBox1.DataBindings.Add(new Binding("Text", objectBinder1, "StoredID", false, DataSourceUpdateMode.OnPropertyChanged));

     

    Свойство Text объектов label и textbox привязано к свойству StoredID объекта textboxbutton1.

    При изменении текста в textBox1, значение StoredID будет меняться, и текст в label1 тоже.

     


    Для связи [mail]
    3 декабря 2010 г. 7:29
  • У меня просто нет слов. Таких слов, которые описывают мои чувства даже в русском мате нет. Оказывается, по умолчанию связь которую устанавливает студия обновляется по событию onvalidate, а не по событию onpropertychange. А так как компонент у меня самописный и поле по которому я связываю тоже самописное. Идет такой косяк.

     

    Как только поставил в закладке databinding-advanced  в свойствах связи обновлять по событию onpropertychange все заработало как надо.

     

    З.Ы.Ж. И ведь самое обидное, такую мелкую деталь и нигде не описали.

     

     


    Truth me,just me. (c) Kaa
    • Помечено в качестве ответа Crusnik 3 декабря 2010 г. 15:43
    3 декабря 2010 г. 15:42