Vinculação de dados por meio de IPropertyNotifySink
Objetos que oferecem suporte a propriedades, por exemplo, por meio da automação OLE e da interface IDispatch, podem permitir que os clientes sejam notificados quando determinadas propriedades alterarem o valor. Essa propriedade é chamada de propriedade vinculável porque as notificações permitem que um cliente sincronize sua própria exibição dos valores de propriedade atuais do objeto. Além disso, os mesmos objetos podem permitir que um cliente controle quando determinadas propriedades podem ser alteradas. Essas propriedades são chamadas de propriedades de edição de solicitação.
O IPropertyNotifySink é uma interface de notificação padrão que oferece suporte a propriedades vinculáveis e de edição de solicitação. IPropertyNotifySink é suportado a partir de um objeto com propriedades como uma interface de saída. Ou seja, a interface em si é implementada pelo objeto de coletor de um cliente, e o cliente conecta o coletor ao objeto de suporte por meio do mecanismo de ponto de conexão descrito anteriormente. O IPropertyNotifySinké definido da seguinte maneira:
interface IPropertyNotifySink : IUnknown
{
HRESULT OnChanged([in] DISPID dispID);
HRESULT OnRequestEdit([in] DISPID dispID);
}
Quando um objeto deseja notificar seus coletores conectados de que uma propriedade vinculável identificada com um determinado DISPID foi alterada, ele chama OnChanged. Se um objeto alterar várias propriedades de uma só vez, ele poderá passar DISPID_UNKNOWN para OnChanged , caso em que um cliente atualizará seu cache de todos os valores de propriedade de interesse.
Quando uma propriedade de edição de solicitação está prestes a ser alterada, um objeto pode perguntar ao cliente se ele permitirá que essa alteração ocorra. O objeto chama OnRequestEdit passando o DISPID da propriedade em questão (ou DISPID_UNKNOWN para identificar todas as propriedades). O coletor do cliente retorna S_OK para indicar que a alteração é permitida ou S_FALSE (ou um erro) para indicar que a alteração não é permitida. Quando um objeto chama OnRequestEdit, é necessário obedecer aos desejos do cliente seguindo a semântica exata de S_OK e S_FALSE valores de retorno.
Observe que OnRequestEdit não pode ser usado para validação de dados porque, no momento da chamada, o novo valor da propriedade ainda não está disponível. A notificação só pode ser usada para controlar um estado somente leitura de uma propriedade.
Os objetos controlam quais propriedades são vinculáveis e solicitam editar e marcar essas propriedades nas informações de tipo do objeto. Nas informações de tipo, o atributo bindable marca uma propriedade como suporte a OnChanged. O atributo requestedit marca uma propriedade como suporte a OnRequestEdit.
Uma propriedade pode oferecer suporte a ambos os comportamentos, caso em que OnRequestEdit é chamado primeiro, e somente se a alteração for permitida é OnChanged chamado.
A única exceção ao comportamento de tais propriedades é que nenhuma notificação é enviada como resultado dos procedimentos de inicialização ou carregamento de um objeto. Nesses momentos, assume-se que todas as propriedades mudam e que todas devem ser autorizadas a mudar. Portanto, as notificações para essa interface só são significativas no contexto de um objeto totalmente inicializado/carregado.
Dois outros atributos podem ser aplicados a propriedades nas informações de tipo de um objeto. O atributo defaultbind marca uma propriedade bindable como sendo a que melhor representa o estado do objeto como um todo. O atributo displaybind marca uma propriedade bindable como adequada para exibição na própria interface do usuário de um cliente.
Tópicos relacionados