外部ルール

External フラグ

External としてマークされたルールは、バインド解除中に特別な動作をします。外部ルール スロットのバインドを解除すると、UnboundSlot オブジェクトがコレクションに追加されます。バインド解除サイクルの最後に、UnbindNotifyEvent イベントが発生し、引数のコレクションが渡されます。このコレクションは、イベント ハンドラが完了したときにクリアされます。

UnbindNotifyEvent ハンドラでは、対象スロットがあるかコレクションを検査して、スロット値の破棄を適切に管理するか、スロットのバインド解除通知に基づいて処理を実行する必要があります。コレクションには、システムのエントリかサード パーティのエントリが含まれているため、すべてのバインド解除されたスロットを処理する必要があると仮定すべきではありません。バインド解除は再バインドではないことに注意してください。バインド解除されたスロットは、パラメータが変更されているため、再バインドされることはありません。このイベント中、ハンドラでは、評価および他の Intent API 呼び出しに十分に注意する必要があります。別のイベントがトリガされる可能性があるためです。この時点ではアクションを実行せず、イベントが完了した後に適用する関連情報の収集のみを行うことをお勧めします。

開発者は、次の 3 つの処理に責任を持ちます。
  • Intent ソース ファイルで適切なルールを External としてマークする
  • イベント ハンドラを作成する
  • ハンドラを登録および登録解除する

Intent ソースでは、外部ルールの値を慎重に扱ってください。この値を他のルールにコピーすると、オブジェクト ハンドルが無効になる可能性があります。依存値のバインドを解除することで、この問題の一部を緩和できますが、考慮する必要はあります。たとえば、次のいずれかを入力します。

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

Foo のバインドを解除すると、Foo2 のバインドも解除されるため、このコピーは "安全" です。しかし、getMyObject(42)が常に同じオブジェクトを返し、バインド解除の応答としてそのオブジェクトを破棄する場合は、Foo3 が無効な参照を持つことになり、潜在的な問題が発生します。この例は極端に簡略化されていますが、さらに複雑な状況が発生する可能性があり、その場合は状況を把握するのが困難になります。

イベントの引数は、UnbindNotifyEventArgs のインスタンスで、このインスタンスには 1 つのグローバルな現在の UnboundSlotCollection への参照が含まれます。UnboundSlot には、スロットの参照チェーンとバインド解除された値が含まれています。この値は、Intent によってそれ以外の方法で変更されていません。ハンドラでは、名前または値によって外部スロットを識別することができます。イベント コレクションにはバインド解除されたすべての外部ルールが含まれるため、ユーザが作成した外部ルールのみを処理することが重要です。名前は、一意になるように選択する必要があります。これが不可能な場合は、バインド解除された値を検証して、含まれるデータがユーザのものであるかどうか確認する必要があります。

バインド解除サイクルとはバインド解除は、スロット内のデータを無効にする任意の処理によってトリガされます。実際、ほとんどのバインド解除は、従属スロットのバインドが解除された結果として行われます。UnbindNotifyEvent は、すべてのバインド解除時にトリガされるのではなく、一連の再帰的なバインド解除終了後に発生します。コレクションは、バインド解除反復処理の "ルート" の開始時は空ですが、終了時にはバインド解除された外部スロットが含まれている可能性があります。コレクションが空のままの場合は、イベントは発生しません。

たいていの場合は、アプリケーションは、多くのバインド解除をトリガする一連の操作を実行し、終了時にイベントを 1 つ処理します。コレクションは、通常どおりに処理され続けますが、イベントは省略されます。これは、ModelEvents の IsUnboundNotifyEnabled プロパティでコントロールします。既定値は True です。False にすると、UnbindNotifyEvent は省略されますが、コレクションの処理は続けられます。True にするとすぐに、イベントが発生します(コレクションは空ではないと仮定した場合。空の場合はイベントは発生しません)。

その他のフラグ

External は、次のフラグと組み合わせて使用することはできません(組み合わせても意味がありません)。
  • Uncached
  • [グループ]
  • Child
  • [方法]
  • Shared
External は、これら以外のフラグとは組み合わせて使用することができます。External は、バインド解除時のルールの動作のみに影響します。他の特別な処理は行いません。

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

C#

イベントの登録:
// Test of UnbindNotifyEvent
ModelEvents modelEvents = ModelEvents.Instance;
modelEvents.UnbindNotify += UnbindNotifyHandler;
Application.Run(new MainWindow(UIMode));
modelEvents.UnbindNotify ‐= UnbindNotifyHandler;
シンプルなメッセージ ボックス用のイベント ハンドラ:
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");
}