LightSwitchファーストタッチ3(コントロール制御)
Lightswitchを少し触ったので気づいた点をメモ。
コントロールの表示制御やフォーカス制御はコードを記述するとできる。
コントロールの取得
FindControlするとLightSwicthでのコントロール概念にあたるIContentItemProxy型のオブジェクトが取得できる。ただし、これはSilverlightのコントロールではない。同じような機能でDataGridのセル単位の要素を取得するFindControlInCollectionもある。
Silverlightのコントロールを取得したい場合はIContentItemProxyのControlAvailableイベントを利用する。コントロールに対する操作はDispatchers.Main.BeginInvokeを使ってUIスレッドで処理する必要がある。
private DataGrid grid; partial void EditableNameItemSetGrid_Created() { this.FindControl("grid").ControlAvailable += new EventHandler<ControlAvailableEventArgs>(EditableNameItemSetGrid_ControlAvailable); } void EditableNameItemSetGrid_ControlAvailable(object sender, ControlAvailableEventArgs e) { grid = (DataGrid)e.Control; } partial void Hoge_Execute() { Dispatchers.Main.BeginInvoke(() => { grid.BeginEdit(); }); }
スレッド
LightSwitchの画面処理は2つのスレッドで行われる。
-
- Screenスレッド(データ操作)
- UIスレッド(コントロール処理)
ユーザコード(カスタム検証ルールや計算されたプロパティ、Screenで定義したメソッド)はScreenスレッドで動作するのでコントロール処理を行う場合はUIスレッドにディスパッチする必要がある。先ほどの例がこれにあたる。
フォーカス制御
フォーカス制御はFindControlしてIContentItemProxyを取得し、Focusメソッドを実行する
partial void SearchCategories_Activated() { IContentItemProxy ctrl = this.FindControl("CID"); ctrl.Focus(); }
なお、FindControlInCollectionで取得したDataGridのセルに対してFocusではできない。DataGridのセルはControlAvailableなどのイベントも利用できない
表示/表示、有効/無効制御
表示/非表示、有効/無効、読み取り専用の動的な変更は以下のFindControl/FindControlInCollectionしたIContentItemProxyの以下のプロパティに対して設定することが可能。コントロールによっては一部機能しないものがあるので注意。
-
- bool IsEnabled { get; set; }
- bool IsReadOnly { get; set; }
- bool IsVisible { get; set; }
partial void EditableNameItemSetGrid_Created() { foreach (var ent in this.NameItemSet) { this.FindControlInCollection("Name1", ent).IsEnabled = false; } }
スクリーン・イベント
スクリーンで発生するイベントとその順序は「LightSwitch – In What Order do Screen Events Fire?」に様々な操作に対しての例が載っている。詳細型画面の起動時のシーケンスは以下のようになっている。SCREENや画面プロパティ、データカラムのイベントが混ざって発生する。
-
- New(コンストラクタ)
- ID_Changedイベント(データカラム)
- InitializeDataWorkspaceイベント(SCREEN)
- Createdイベント(SCREEN)
- Activatedイベント(SCREEN)※アクティブになるごとに発生
- Validateイベント(画面プロパティ)
- ID_Validateイベント(データカラム)
- Loadedイベント(画面プロパティ)