Войти



Поиск

Полезное:

Новые статьи

Опечатка?

Выделите текст и нажмите Shift+Enter.
И мы в ближайшее время ее исправим!

Счетчики


Поддержка уведомлений о редактировании объекта при помощи событий изменения свойств

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

элемент управления, извлекающий или устанавливающий свойства объекта. Когда вы изменяете свойство объекта через привязанный элемент управления, последний будет изменять значения через дескрипторы свойств объекта. Контейнеры этих объектов, такие, как источник привязки, могут подключать возвратный вызов, чтобы получать уведомления при изменении значений свойства через дескриптор (как говорилось в главе 7 и будет продемонстрировано далее в этой главе). Когда это происходит, другие элементы управления, которые непосредственно или косвенно привязаны к тому же источнику, могут обновляться при возбуждении контейнером события ListChanged в реализации интерфейса IBindingList.

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

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

Одним из способов решения этой проблемы является реализация событий изменения свойства в объекте Customer (или любом другом объекте, для которого вы хотите поддерживать привязку данных). События изменения свойств являются событиями, которые вы определяете в объекте и которые уведомляют всех, кто в этом заинтересован, всякий раз, когда свойство объекта изменяется. Для механизмов привязки данных в Windows Forms принято соглашение об именах таких событий: для каждого свойства должно быть опубликовано событие <propertyname>Changed, где вместо <propertyname> подставляется имя данного свойства.

Для нашего объекта Customer и ограниченной поддержки изменений только свойств CustomerName и Customerld это означает определение в классе двух событий: CustomerNameChanged и CustomerldChanged. Эти события должны иметь тип EventHandler и запускаться всякий раз при изменении соответствующего свойства. Это можно легко сделать в set-блоках самих свойств, как показано в следующем модифицированном коде класса Customer:

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

Теперь, когда весь этот код на месте, если вы нажмете ранее добавленную кнопку, которая непосредственно модифицирует свойство объекта в коллекции, сетка немедленно отразит изменение. Вы увидите также, что если вы редактируете ячейку в сетке заказчиков, а затем нажимаете Esc для отмены изменений, поле Customer в сетке заказов также обновится при откате, поскольку элемент управления вызовет CancelEdit. Если бы вы реализовали откат в CancelEdit не через установку свойств, о чем упоминалось ранее, то события изменения свойств не запускались бы, и любые

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




Newer news items:
Older news items:

 
Главная Страница Контактная Информация Поиск по сайту Контактная Информация Поиск по сайту