透過 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 屬性會將可繫結屬性標示為適合在用戶端自己的使用者介面中顯示。
相關主題