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_FALStandard Edition (またはエラー) を返します。 オブジェクトが OnRequestEdit を呼び出すときは、S_OKとS_FALStandard Edition戻り値の正確なセマンティクスに従って、クライアントの希望に従う必要があります。
OnRequestEdit は、呼び出し時にプロパティの新しい値がまだ使用できないため、データ検証に使用できないことに注意してください。 通知は、プロパティの読み取り専用状態を制御するためにのみ使用できます。
オブジェクトは、バインド可能なプロパティを制御し、オブジェクトの型情報でこのようなプロパティの編集とマークを要求します。 型情報では、バインド可能な属性によって、プロパティが OnChanged をサポート するものとしてマークされます。 属性 requestedit は、プロパティを OnRequestEdit をサポート するものとしてマークします。
1 つのプロパティで両方の動作をサポートできます。この場合、OnRequestEdit が最初に呼び出され、変更が許可されている場合にのみ OnChanged が呼び出されます。
このようなプロパティの動作の 1 つの例外は、オブジェクトの初期化または読み込みプロシージャの結果として通知が送信されない点です。 このような場合、すべてのプロパティが変更され、すべてのプロパティの変更が許可されている必要があると見なされます。 したがって、このインターフェイスへの通知は、完全に初期化/読み込まれたオブジェクトのコンテキストでのみ意味があります。
オブジェクトの型情報のプロパティには、他の 2 つの属性を適用できます。 defaultbind 属性は、バインド可能なプロパティを、オブジェクト全体の状態を最もよく表すものとしてマークします。 displaybind 属性は、クライアント独自のユーザー インターフェイスでの表示に適したバインド可能なプロパティをマークします。
関連トピック