Двусторонние объекты привязки данных - PullRequest
0 голосов
/ 29 октября 2008

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

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

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

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

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

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

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

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

Спасибо

1 Ответ

1 голос
/ 29 октября 2008

Я почти уверен, что все, что связано с изменениями других людей, должно было бы попасть в базу данных. Для двусторонней привязки все, что вам действительно нужно, - это уведомление об изменении - т.е. 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 для объекта данных и привязать его непосредственно к текстовому полю и т. Д.

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