通过 IPropertyNotifySink 进行数据绑定

支持属性的对象(例如,通过 OLE 自动化和 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 属性将可绑定属性标记为适合在客户端自己的用户界面中显示。

属性页和属性表