Поделиться через


Привязка данных через IPropertyNotifySink

Объекты, поддерживающие свойства, например с помощью OLE Automation и интерфейса IDispatch , могут позволить клиентам получать уведомления при изменении определенного значения свойств. Такое свойство называется привязываемым свойством, так как уведомления позволяют клиенту синхронизировать собственное отображение текущих значений свойств объекта. Кроме того, те же объекты могут позволить клиенту контролировать, когда некоторые свойства могут изменяться. Такие свойства называются свойствами редактирования запросов.

IPropertyNotifySink — это стандартный интерфейс уведомлений, который поддерживает привязываемые и редактируемые свойства. IPropertyNotifySink поддерживается из объекта со свойствами в качестве исходящего интерфейса. То есть сам интерфейс реализуется объектом приемника клиента, и клиент подключает приемник к вспомогательному объекту через механизм точки подключения, описанный ранее. IPropertyNotifySink определяется следующим образом:

interface IPropertyNotifySink : IUnknown 
  { 
    HRESULT OnChanged([in] DISPID dispID); 
    HRESULT OnRequestEdit([in] DISPID dispID); 
  } 
 

Когда объект хочет уведомить подключенные приемники о том, что привязываемое свойство, идентифицированное с заданным DISPID, изменилось, он вызывает OnChanged. Если объект изменяет несколько свойств одновременно, он может передать DISPID_UNKNOWN в OnChanged , в котором клиент обновляет кэш всех интересующих значений свойств.

Когда свойство изменения запроса будет изменено, объект может попросить клиента, будет ли он разрешать это изменение. Объект вызывает OnRequestEdit , передав идентификатор DISPID данного свойства (или DISPID_UNKNOWN для идентификации всех свойств). Приемник клиента возвращает S_OK, чтобы указать, что изменение разрешено или S_FALSE (или ошибка), чтобы указать, что изменение запрещено. Когда объект вызывает OnRequestEdit, необходимо соблюдать пожелания клиента, следуя точной семантике S_OK и S_FALSE возвращаемых значений.

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

Объекты управляют свойствами, которые можно привязать, и запрашивают изменение и пометьте такие свойства в сведениях о типе объекта. В сведениях о типе привязываемый атрибут помечает свойство как поддерживающее OnChanged. Атрибут requestedit помечает свойство как поддерживающее OnRequestEdit.

Одно свойство может поддерживать оба поведения, в этом случае вызывается OnRequestEdit, и только в том случае, если изменение разрешено, вызывается OnChanged.

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

Два других атрибута могут применяться к свойствам в сведениях о типе объекта. Атрибут defaultbind помечает привязываемое свойство как то, что лучше всего представляет состояние объекта в целом. Атрибут displaybind помечает привязываемое свойство, подходящее для отображения в собственном пользовательском интерфейсе клиента.

Страницы свойств и листы свойств