Externe Regeln

Externes Flag

Eine als extern markierte Regel weist beim Aufheben von Bindungen ein bestimmtes Verhalten auf. Wenn die Bindung des Slots einer externen Regel aufgehoben wird, wird ein UnboundSlot-Objekt zu einer Sammlung hinzugefügt. Am Ende eines Bindungsaufhebungszyklus wird ein UnbindNotifyEvent-Ereignis ausgelöst, wobei sich die Sammlung in einem Argument befindet. Nach Abschluss des Ereignis-Handlers wird die Sammlung gelöscht.

Der UnbindNotifyEvent-Handler muss die Sammlung auf entsprechende Slots prüfen und die Zerstörung des Slotwerts entsprechend verwalten oder lediglich eine Aktion ausführen, die auf der Benachrichtigung basiert, dass die Bindung des Slots aufgehoben wurde. Die Sammlung kann Einträge für Systemslots oder für Slots von Drittanbietern enthalten. Gehen Sie also nicht davon aus, dass alle ungebundenen Slots behandelt werden müssen. Beachten Sie, dass das Aufheben von Bindungen kein Wiederherstellen der Bindung impliziert. Für einen ungebundenen Slot kann aufgrund von Parameteränderungen eine Bindung nicht wiederhergestellt werden. Der Handler muss sehr mit Auswertung oder anderen Intent-API-Aufrufe während dieses Ereignisses sehr vorsichtig sein. Es ist möglich, dass ein anderes Ereignis ausgelöst wird. Es wird empfohlen, zu diesem Zeitpunkt keine Aktion durchzuführen und nur die Sammlung von relevanten Informationen nach Abschluss des Ereignisses anzuwenden.

Die Entwickler ist für drei Dinge verantwortlich:
  • Markierung von entsprechenden Regeln in Intent-Quelldateien als Extern
  • Erstellen des Ereignis-Handlers
  • Registrieren des Handlers und Aufheben der Registrierung

In Intent-Quelldateien müssen die Werte von externen Regeln sorgfältig behandelt werden. Das Kopieren dieser Werte in andere Regeln kann veraltete Objektreferenzen zur Folge haben. Das Aufheben der Bindung von abhängigen Werten kann dieses Problem zwar nur teilweise lösen, sollte aber dennoch in Erwägung gezogen werden. Beispiel:

External Rule Foo as User = getMyData(42)
Rule Foo2 as User = Foo
Rule Foo3 As User = getMyData(42)

Wenn Foo nicht gebunden ist, ist Foo2 ebenfalls nicht gebunden, sodass diese Kopie "sicher" ist. Aber wenn getMyObject(42) immer das gleiche Objekt zurückgibt und Ihre Reaktion auf das Aufheben der Bindung darin besteht, das Objekt zu zerstören, enthält Foo3 eine veraltete Referenz und es treten möglicherweise Probleme auf. Diese Beispiele sind stark vereinfacht. Es sind viel komplexere Situationen möglich, die nur schwer zu erkennen sind.

Das Argument im Ereignis ist ein Exemplar von UnbindNotifyEventArgs, das eine Referenz auf die einzige globale aktuelle UnboundSlotCollection enthält. Ein UnboundSlot enthält eine Referenzkette für den Slot, und die Bindung für den Wert wurde aufgehoben. Der Wert wurde ansonsten von Intent nicht weiter verändert. Der Handler kann die eigenen externen Slots anhand des Namens oder Werts erkennen. Da sich alle externen Regeln, deren Bindung aufgehoben wurde, in der Ereignissammlung befinden, ist es wichtig, nur diejenigen zu verarbeiten, die von Ihnen erstellt wurden. Namen müssen so ausgewählt werden, dass sie eindeutig sind. Wenn dies nicht möglich ist, muss der ungebundene Wert geprüft werden, um sicherzustellen, dass die enthaltenen Daten Ihre sind.

Was ist ein Bindungsaufhebungszyklus? Eine Bindungaufhebung wird durch Vorgänge ausgelöst, durch die die Daten in einem Slot ungültig werden. Die meisten Bindungsaufhebungen sind tatsächlich das Ergebnis der Bindungsaufhebung bei einem abhängigen Slot. UnbindNotifyEvent wird nicht bei jeder Bindungsaufhebung, sondern vielmehr nach Abschluss einer Reihe von rekursiven Bindungsaufhebungen ausgelöst. Die Sammlung ist zu Beginn des "Stamms" der Bindungsaufhebungswiederholung leer und enthält am Ende möglicherweise externe ungebundene Slots. Wenn Sie die Sammlung am Ende immer noch leer ist, wird kein Ereignis ausgelöst.

Es ist häufig der Fall, dass eine Anwendung eine Reihe von Vorgängen ausführen möchte, die viele Bindungsaufhebungszyklen auslösen, und am Ende ein einzelnes Ereignis behandeln möchte. Die Sammlung wird weiterhin normal verarbeitet, aber das Ereignis wird unterdrückt. Dies wird durch die Eigenschaft IsUnboundNotifyEnabled von ModelEvents gesteuert. Der Vorgabewert lautet True. Wurde False festgelegt, wird UnbindNotifyEvent unterdrückt, die Sammlung wird jedoch fortgesetzt. Sobald der Wert auf True gesetzt wird, wird das Ereignis ausgelöst (vorausgesetzt, die Sammlung ist nicht leer, denn das Ereignis wird nicht ausgelöst, wenn die Sammlung leer ist).

Sonstige Flags

Extern darf nicht in Kombination mit den folgenden Flags verwendet werden, da es sonst keine Bedeutung hat:
  • Uncached
  • Gruppe
  • Child
  • Methode
  • Shared
Extern kann ansonsten in Kombination mit anderen Flags verwendet werden. Extern wirkt sich nur auf das Verhalten der Regel zum Zeitpunkt der Bindungsaufhebung aus. Ansonsten wird keine weitere spezielle Behandlung vorgenommen.

Beispiel

Intent-Quelle:
Design INT_817 : BasePart
    External Parameter Rule Ex1 As Integer = 42
    Rule DependsOnEx1 As Integer = Floor(Ex1 / 2)
End Design

C#

Registrieren des Ereignisses:
// Test of UnbindNotifyEvent
ModelEvents modelEvents = ModelEvents.Instance;
modelEvents.UnbindNotify += UnbindNotifyHandler;
Application.Run(new MainWindow(UIMode));
modelEvents.UnbindNotify ‐= UnbindNotifyHandler;
Der Ereignis-Handler für das einfache Meldungsfeld:
private static void UnbindNotifyHandler(Object sender, UnbindNotifyEventArgs args)
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder("Slot Refchain\tValue\n");
    foreach (UnboundSlot us in args.SlotCollection)
    {
        sb.Append(us.RefChain.AsString + "\t" + us.Value + "\n");
    }
    MessageBox.Show(sb.ToString(),"UnbindNotifyEvent");
}