Datenbindung über IPropertyNotifySink
Objekte, die Eigenschaften unterstützen, z. B. über OLE Automation und die IDispatch-Schnittstelle , möchten möglicherweise zulassen, dass Clients benachrichtigt werden, wenn bestimmte Eigenschaften den Wert ändern. Eine solche Eigenschaft wird als bindbare Eigenschaft bezeichnet, da die Benachrichtigungen es einem Client ermöglichen, seine eigene Anzeige der aktuellen Eigenschaftswerte des Objekts zu synchronisieren. Darüber hinaus können dieselben Objekte es einem Client ermöglichen, zu steuern, wann bestimmte Eigenschaften geändert werden dürfen. Solche Eigenschaften werden als Anforderungsbearbeitungseigenschaften bezeichnet.
IPropertyNotifySink ist eine Standardbenachrichtigungsschnittstelle, die bindungsfähige Eigenschaften und Anforderungsbearbeitungseigenschaften unterstützt. IPropertyNotifySink wird von einem Objekt mit Eigenschaften als ausgehende Schnittstelle unterstützt. Das heißt, die Schnittstelle selbst wird durch das Senkenobjekt eines Clients implementiert, und der Client verbindet die Senke mit dem unterstützenden Objekt über den zuvor beschriebenen Verbindungspunktmechanismus. Der IPropertyNotifySinkist wie folgt definiert:
interface IPropertyNotifySink : IUnknown
{
HRESULT OnChanged([in] DISPID dispID);
HRESULT OnRequestEdit([in] DISPID dispID);
}
Wenn ein Objekt seine verbundenen Senken benachrichtigen möchte, dass sich eine bindungsfähige Eigenschaft, die mit einer bestimmten DISPID identifiziert wurde, geändert hat, ruft es OnChanged auf. Wenn ein Objekt mehrere Eigenschaften gleichzeitig ändert, kann es DISPID_UNKNOWN an OnChanged übergeben. In diesem Fall aktualisiert ein Client seinen Cache aller relevanten Eigenschaftswerte.
Wenn sich eine Anforderungsbearbeitungseigenschaft ändert, kann ein Objekt den Client fragen, ob es diese Änderung zulässt. Das -Objekt ruft OnRequestEdit auf und übergibt die DISPID der betreffenden Eigenschaft (oder DISPID_UNKNOWN, um alle Eigenschaften zu identifizieren). Die Senke des Clients gibt S_OK zurück, um anzugeben, dass die Änderung zulässig ist, oder S_FALSE (oder ein Fehler), um anzugeben, dass die Änderung nicht zulässig ist. Wenn ein Objekt OnRequestEdit aufruft, muss es den Wünschen des Clients entsprechen, indem es die genaue Semantik der S_OK und S_FALSE Rückgabewerte befolgt.
Beachten Sie, dass OnRequestEdit nicht für die Datenüberprüfung verwendet werden kann, da zum Zeitpunkt des Aufrufs der neue Wert der Eigenschaft noch nicht verfügbar ist. Die Benachrichtigung kann nur verwendet werden, um einen schreibgeschützten Zustand für eine Eigenschaft zu steuern.
Objekte steuern, welche Eigenschaften gebunden werden können, und fordern das Bearbeiten und Markieren solcher Eigenschaften in den Typinformationen des Objekts an. In den Typinformationen markiert das bindbare Attribut eine Eigenschaft als Unterstützung für OnChanged. Das Attribut requestedit kennzeichnet eine Eigenschaft als Unterstützung für OnRequestEdit.
Eine Eigenschaft kann beide Verhaltensweisen unterstützen. In diesem Fall wird OnRequestEdit zuerst aufgerufen, und nur wenn Änderung zulässig ist, wird OnChanged aufgerufen.
Die einzige Ausnahme vom Verhalten solcher Eigenschaften besteht darin, dass keine Benachrichtigungen als Ergebnis der Initialisierungs- oder Ladeprozeduren eines Objekts gesendet werden. In solchen Zeiten wird davon ausgegangen, dass sich alle Eigenschaften ändern und dass alle sich ändern dürfen. Benachrichtigungen an diese Schnittstelle sind daher nur im Kontext eines vollständig initialisierten/geladenen Objekts sinnvoll.
Zwei weitere Attribute können auf Eigenschaften in den Typinformationen eines Objekts angewendet werden. Das defaultbind-Attribut kennzeichnet eine bindungsfähige Eigenschaft als diejenige, die den Zustand des Objekts als Ganzes am besten darstellt. Das displaybind-Attribut kennzeichnet eine bindbare Eigenschaft als geeignet für die Anzeige in der eigenen Benutzeroberfläche eines Clients.
Zugehörige Themen