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や画面プロパティ、データカラムのイベントが混ざって発生する。

    1. New(コンストラクタ)
    2. ID_Changedイベント(データカラム)
    3. InitializeDataWorkspaceイベント(SCREEN)
    4. Createdイベント(SCREEN)
    5. Activatedイベント(SCREEN)※アクティブになるごとに発生
    6. Validateイベント(画面プロパティ)
    7. ID_Validateイベント(データカラム)
    8. Loadedイベント(画面プロパティ)