2008-10-29 2 views
0

Недавно я использовал приложение, которое было впечатляющим. Все формы, унаследованные от их собственных классов и «формы», обладали удивительной функциональностью и выглядели орехами.Объекты привязки двухсторонних данных

Меня интересует эта «функция» формы. Это был проект C# WinForms и сдул меня.

Формы были привязаны к объектам, которые группа написала для поддержки двусторонней передачи данных (в некоторой степени). То, как они вели себя, было довольно просто:

Форматы ввода данных все имели элементы управления, унаследованные от текстового поля, и они были привязаны к свойствам объекта. Ввод данных немедленно подтвердил его, и поле было светло-розовым, если проверка не выполнена, и светло-зеленый, если он пройдет. Если окно становится синим, это означает, что значение в базе данных изменилось, и ваши изменения в элементах управления были немедленно сохранены при вводе действительных значений. Это было так, что иногда часть элементов управления должна была заполняться до того, как произошло спасение. Но все было автоматически. Вы можете остановиться в любой момент и вернуться позже и продолжить, не спасая себя.

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

Все это произошло из-за использования собственного класса формы, который они написали, и их собственных элементов управления текстовыми полями, привязанных к объекту.

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

Для простоты. Как я могу создать объект или коллекцию объектов, имитирующих bahaviour. Я не собираюсь, но я даже не вижу, как это сделать.

Благодаря

ответ

1

Я уверен, что все, включая изменения других людей нуждались бы попасть в базу данных. Для двусторонней привязки, все вы действительно требуется уведомление об изменении - т. Е. INotifyPropertyChanged (или FooChanged событие за каждые Foo). Все это абстрагируется на TypeDescriptor - то есть любое связывание, которое использует обычную реализацию PropertyDescriptor (что должно) должно знать об уведомлениях через SupportsChangeEvents, AddValueChanged и RemoveValueChanged.

Для подтверждения - IDataErrorInfo - твой друг; реализуя это, вы можете добровольно опубликовать информацию валидации (которая используется и отображается несколькими элементами управления, такими как DataGridView). т.е.

IDataErrorInfo dei = obj as IDataErrorInfo; 
if(dei != null) { // supports validation 
    string err = dei["PropName"]; // or .Error for overall status 
    bool clean = string.IsNullOrEmpty(err); 
} 

Обратите внимание, что альтернативный подход будет иметь Color свойства на aobject данных, и которые непосредственно связывается с текстовым полем и т.д.