コレクションをバインドする際、標準のコンポーネントでは遅すぎて使い物にならなかったため、TBidingEditorとTBindSourceAdapterをカスタマイズ。
その際に使用したインターフェースのメモ。
XE5時点なので、最新の環境では代わっているかも(XE7ではそれほど差異はなさげだけど)
よく使わそうなインターフェース
-
IScope
- バインドの対象。
- 入力側と出力側にそれぞれ1本ずつ手配される。
- データソース -> UIコンポーネントであれば、入力側:データソース、出力側:UIコンポーネントとなる。
- 逆方向であれば、入出力が反転する。
- バインディングエンジンは、入力側スコープにバインド式を適用してIValue型として取り出し、その値を出力側スコープにバインド式を適用して割り当てる。
- メソッド
- LookUpメソッドを使用して、IGroupインスタンスを検索する。
-
IGroup
- ひとつのバインド式に対しひとつ作られる。
- IScope.LookUpメソッドを呼んだ場合にこの型の値を返す。
- IGroupはバインド式を評価した際に作成される、グループインスタンスと呼ばれる値を保持するロールを提供する
- メソッド
- Add: 渡された対象をグループインスタンスに変更し、格納する。
- Wrappers: 指定したインデックスのグループインスタンスを取得する。
-
IValue
- グループインスタンス候補
- 入力側から値を取り出すロールを提供する
- メソッド
- GetValue: 入力側から値を取り出す
- GetType: 値の型を取得。主に値を変換するConverterを選択する際に使われている。
-
ILocation
- グループインスタンス候補
- 出力先に値を割り当てるロールを提供する
- メソッド
- SetValue: 出力先に値を割り当てる
-
IArguments, IInvokable
- グループインスタンス候補
- バインド式にIndexedPropertyを使う場合(例えば、Foo['Bar'])に使用する(どちらかいずれかでよい)
-
IPlaceholder
- グループインスタンスの値を初期化、またはキャッシュされた評価結果を破棄するロールを提供する
- TBindGridList(TBindGridListLink)を使う場合、入出力のスコープが再利用されるため、必須インターフェース
- 通常、IScopeと共に指定してクラス定義する
- メソッド
- Detach: グループインスタンスの値を破棄するけど、どこからも呼ばれてない死にメソッド。
- Attach: グループインスタンス値を割り当てる。Detachが役立たずなので、初期化と破棄の両方をおこなわせることとなる。
- このメソッドだけしっかり実装する。
- グループインスタンスの値を初期化、またはキャッシュされた評価結果を破棄するロールを提供する
正直要らない子たち
-
IWrapperBinding, IScopeSymbols
- デザイナを介してLiveBindingを使用する場合、設定だけはするが、その値をどこでも利用してなさげな謎のインターフェース。
- IScopeに複数のIGroupを保持している場合に、式の評価前に初期化(Attach)する対象を検索する目的で使用した。
-
IScopeEnumerable
- クラス定義の際、IScopeと一緒に指定し、スコープが保持する子要素(IGroup, IScope,..)を列挙する。
-
ScopeEx
- 文字列ではなく、オブジェクトをキーにしてIGroupを取得できる。
- LiveBindingデザイナを使う場合は、NO DEBAN。
-
IChild, IWrapper
- 実際に値が割り当てられる直前、直後にそれぞれ発行されるイベント、OnAssigningValue OnAssignedValueに関係する(っぽい)
- 特に使わなくても何とかなったので、詳細には調べてないです。