2010-06-15 4 views
29

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

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

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

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

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

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

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

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

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

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

+4

Я думаю, что это отличный вопрос (список связанных вопросов), который каким-то образом не смог получить достойный ответ. – HK1

ответ

4

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

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

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

Я надеялся на ответ, объясняющий использование BindingSources, поскольку они относятся к моим двум примерам, но поскольку неделя прошла без каких-либо других ответов, я выберу это как принятый ответ. Любые другие ответы по-прежнему приветствуются, хотя ... – Justin

+3

Четвёрка, безусловно, ваша ошибка;) IErrorProvider работает без BindingSource, но вам нужно реализовать IDataErrorInfo на вашей модели. Описано здесь: http://msdn.microsoft.com/en-us/library/41e17s4b.aspx ... определенно хорошо написанная статья. Мэйб, ваше решение Джулиан? – 70sCommander

2

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

3

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

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

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

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

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

Управление валютами действительно удобно в случае интерфейса мастера/детализированного интерфейса. Итак, допустим, у вас есть ListBox студентов на левой панели (Мастер) и несколько текстовых полей, ComboBoxes, CheckBoxes и т. Д. В правой панели, с сеткой выбранных студенческих курсов (Detail). В DataSet у вас есть две таблицы данных: Student и Courses. Для простоты я избегаю gerund (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 позаботится об текущей записи в списке учеников и обновит не только атомные элементы управления (TextBoxes, ComboBoxes и т. Д.), Но и сетку курсов, которая автоматически обновит его содержимое, чтобы отобразить курсы выбранного в данный момент студент.

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

+0

Спасибо за это @dotNET. Поэтому, если вы посмотрите на два (очень простых) примера, которые я упоминаю в вопросе, означает ли это, что вы не будете использовать BindingSource для любого из них, поскольку управление валютой не требуется? – Justin

+0

@ Justin: В обоих случаях да. 'BindingSource' предоставляет некоторые другие возможности, такие как фильтрация и мультисортировка (сортировка по нескольким столбцам), которые могут быть достигнуты с помощью' BindingSource', или вы можете напрямую изменять 'DataTable.DefaultView.RowFilter' и' DataTable.DefaultView.Sort 'свойства для достижения того же. – dotNET

Смежные вопросы