Как связать элементы друг с другом? - PullRequest
0 голосов
/ 20 января 2012

У меня есть Control, в котором я связываю свой собственный класс Element с "DataBindings".Если я изменю «Ширина» и «Высота», например, на «Е», Control также изменит те же свойства.Но с другой стороны это не работает.

this.DataBindings.Add("Width", E, "Width");
this.DataBindings.Add("Height", E, "Height");

Как лучше всего это исправить?Только руками, проблема в том, что там много свойств?Или существует что-то вроде «DataBindings»?

PS Element не унаследовано ни от одного класса, у него нет «DataBindings».Спасибо!

Ответы [ 4 ]

2 голосов
/ 20 января 2012

Чтобы заставить его работать в обоих направлениях, должно присутствовать следующее:

  • Оба Proerties должны быть свойствами зависимости, или содержащий класс должен реализовывать INotifyPropertyChanged
  • Mode привязки должно быть TwoWay

РЕДАКТИРОВАТЬ: Только что увидел, что вы используете WinForms - я не уверен, что он работает там же!

0 голосов
/ 20 января 2012

При добавлении привязок используйте одну из перегрузок, которые позволяют вам установить DataSourceUpdateMode и установить его на DataSourceUpdateMode.OnPropertyChanged

0 голосов
/ 20 января 2012

Я не думаю, что элемент управления сообщит об изменениях свойств ширины и высоты слушателям привязки данных.

Попробуйте добавить INotifyPropertyChanged к элементу управления и самостоятельно принять свойства Width и Height.

Пример использования элемента управления Panel:

public class PanelEx : Panel, INotifyPropertyChanged {
  public event PropertyChangedEventHandler PropertyChanged;

  public new int Width {
    get { return base.Width; }
    set {
      base.Width = value;
      OnPropertyChanged("Width");
    }
  }

  public new int Height {
    get { return base.Height; }
    set {
      base.Height = value;
      OnPropertyChanged("Height");
    }
  }

  private void OnPropertyChanged(string propertyName) {
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}

Затем измените вызов привязки данных на этот, где this - это ваш элемент управления с вышеприведенной реализацией:

this.DataBindings.Add("Width", E, "Width", false, DataSourceUpdateMode.OnPropertyChanged);
this.DataBindings.Add("Height", E, "Height", false, DataSourceUpdateMode.OnPropertyChanged);
0 голосов
/ 20 января 2012

Вы должны реализовать INotifyPropertyChanged в своем классе E для каждого свойства, которое хотите связать.

Иначе не будет работать.Control должен иметь * Измененное событие для каждого свойства, для которого требуется обновить источник данных.Для вашего примера вы можете попробовать использовать свойство Size элемента управления, поскольку существует событие SizeChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...