Когда стоит использовать BindingSource? - PullRequest
31 голосов
/ 15 июня 2010

Мне кажется, я достаточно хорошо понимаю, что делает класс BindingSource - т.е. обеспечивает уровень косвенности между источником данных и элементом управления UI.Он реализует интерфейс IBindingList и, следовательно, также обеспечивает поддержку сортировки.И я использовал это достаточно часто, без особых проблем.Но мне интересно, пользуюсь ли я им чаще, чем следовало бы.Возможно, поможет пример.

Допустим, у меня есть просто текстовое поле на форме (с использованием WinForms), и я хотел бы привязать это текстовое поле к простому свойству внутри класса, который возвращает строку.Стоит ли использовать BindingSource в этой ситуации?

Теперь, допустим, у меня есть сетка в форме, и я хотел бы привязать ее к DataTable.Должен ли я использовать BindingSource сейчас?

В последнем случае я бы, вероятно, не использовал бы BindingSource, поскольку DataTable, из того, что я могу собрать, предоставляет те же функциональные возможности, что и сам BindingSourceбыло бы.DataTable будет запускать нужные события при добавлении, удалении строки и т. Д., Чтобы сетка автоматически обновлялась.

Но в первом случае, когда текстовое поле привязано к строке, я, вероятно, получукласс, который содержит строковое свойство, реализует INotifyPropertyChanged, чтобы он мог инициировать событие PropertyChanged при изменении строки.Я бы использовал BindingSource, чтобы он мог прослушивать эти события PropertyChanged, чтобы он мог автоматически обновлять текстовое поле при изменении строки.

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

(1) Стоит ли использоватьBindingSource в любом из приведенных выше примеров?

(2) Кажется, что разработчики просто «предполагают», что класс DataTable сделает правильную вещь, запустив события PropertyChanged в нужное время.Как узнать, способен ли источник данных сделать это?Существует ли конкретный интерфейс, который должен реализовывать источник данных, чтобы разработчики могли предполагать такое поведение?

(3) Имеет ли значение то, с чем связан элемент управления при рассмотрении вопроса об использованииBindingSource?Или это только источник данных, который должен влиять на решение?Возможно, ответ таков (и это может показаться достаточно логичным): элемент управления должен быть достаточно интеллектуальным, чтобы прослушивать события PropertyChanged, в противном случае требуется BindingSource.Так как же определить, способен ли Контрол на это?Опять же, есть ли конкретный интерфейс, который разработчики могут искать, который должен реализовывать элемент управления?

Именно эта путаница в прошлом приводила меня к всегда с использованием BindingSource.Но я бы хотел лучше понять, когда именно его использовать, так что я делаю это только тогда, когда это необходимо.

Ответы [ 3 ]

4 голосов
/ 30 марта 2015

Довольно старый вопрос.Интересно, почему никто не ответил на это до сих пор.Хорошо, я постараюсь поделиться своими впечатлениями.

A BindingSource - это больше, чем просто способ привязать элементы управления к коллекциям.Проработав в WinForms более десяти лет, лучшие функции BindingSource, которые мне нравятся больше всего, включают:

  1. Binding (конечно!)
  2. Управление валютой (IЯ вернусь к этому через секунду)
  3. A BindingSource может выступать в качестве источника данных другого BindingSource.

Чтобы полностью оценить этифункции, я объясню их в контексте DataSet, который на сегодняшний день является наиболее распространенным типом источника данных, используемого в WinForms, особенно в бизнес-приложениях.

Управление валютой сводится к концепциииз текущей записи .DataTable - это просто набор DataRow с, т.е. в DataTables не существует понятия текущей записи.То же самое относится и к DataView (на боковой ноте вы не можете напрямую привязать к DataTable; когда вы это делаете, он фактически привязывается к свойству DefaultView этого DataTable, которое является DataViewВы также можете создать свой собственный DataView).

Управление валютой действительно удобно при использовании интерфейса Master / Detail.Допустим, у вас есть ListBox учеников на левой панели (мастер) и несколько текстовых, комбинированных, флажков и т. Д. На правой панели с сеткой выбранных курсов учеников (подробно).В вашем наборе данных у вас есть две таблицы данных с именами Student и Courses.Ради простоты я избегаю герунда (Student_Course) здесь.Таблица Course имеет внешний ключ StudentID.Вот как вы можете настроить привязку здесь (обратите внимание, как все 3 функции, которые я перечислил выше, используются в настройке ниже):

  1. Добавьте два элемента управления BindingSource в вашу форму с именами bsStudent и bsCourses.
  2. Установить DataSource из bsStudent в Student DataTable.
  3. Установить DataSource из bsCourses в bsStudent!
  4. В DataMemberсвойство, вы увидите имя отношения, которое существует в DataSet между нашими двумя таблицами.Выберите его!
  5. Установите привязку отдельных атомарных элементов управления к свойствам bsStudent.
  6. Установите DataSource сетки курсов bsCourses.

Ивсе готовоНе написав ни одной строки кода (так сказать), вы успешно создали представление основных данных.Элемент управления BindingSource теперь позаботится о текущей записи 1068 * в списке студентов и обновит не только элементарные элементы управления (TextBoxes, ComboBoxes и т. Д.), Но также сетку курсов, которая автоматически обновит его содержимое, чтобы показатькурсы выбранного в данный момент студента.

Это, мой друг, роль BindingSource (среди других приятных вещей, таких как сортировка, фильтрация и т. д.), которые мне нравятся больше всего.Без использования BindingSource между вашими элементами управления и хранилищем данных у вас не будет концепции текущей записи, и поэтому вам придется вручную управлять синхронизацией всего пользовательского интерфейса.

4 голосов
/ 15 июня 2010

Привет У меня также есть некоторая путаница по этому вопросу.
Когда я использую таблицы данных, они реализуют все интерфейсы.
Однако я всегда использую bindingsource просто для уверенности .. :)

Есть некоторые аргументы, почему я могу думать о

  1. Несколько просмотров на одном наборе записей. (т.е. 2 сетки с различными порядками сортировки / фильтрами)
  2. Фильтрация, сортировка без изменения порядка сортировки самих записей (Filter / Sort)
  3. Возможность временно отключить привязку по соображениям производительности. (когда в таблице большие обновления, не слушайте все события IXXChanged)
  4. IErrorprovider никогда не работал для меня без источника привязки, однако это может быть моей ошибкой.
3 голосов
/ 23 сентября 2011

Я также хотел бы добавить, что с помощью BindingSource вы можете связать бизнес-объект, который может реализовать событие INotifyPropertyChanged, поэтому, если данные изменяются (с помощью вашего кода или чьего-либо кода), ваш пользовательский интерфейс может автоматически отражать обновления ,

...