private void OnInitializeRecord(object sender, InitializeRecordEventArgs e) { DataRecord dr = e.Record as DataRecord; if (dr != null) { Cell cell = dr.Cells["CustomerName"]; } }
FieldLayout は、特定の DataRecord に含まれる Fields (列) を定義します。DataRecord が作成されると、その Fields が DataItem のプロパティに一致する既存の FieldLayout を探して FieldLayouts コレクションで検索が行われます。FieldLayout が見つかった場合、DataRecord と関連付けられます。見つからない場合は、新しい FieldLayout が作成されます。新しい FieldLayout が作成される時には、 FieldLayoutInitializing イベントと FieldLayoutInitialized イベントが発生します。
新しい FieldLayout の AutoGenerateFieldsResolved プロパティが True を返す場合には、データ項目のあらゆるパブリック プロパティに対して Fields コレクションは自動的に Field が格納されます。
Fields の自動生成は、FieldLayoutInitializing イベントと FieldLayoutInitialized イベントの間に実行されます。
CellValuePresenters の自動生成とビュー依存の配置と組み合わされた Fields の自動生成 (以下に説明) は、最小の労力で、複雑なデータ ソースにバインドして、データを表示/編集するための堅牢な UI を表示するための非常に優れた「ノータッチ」配備ソリューションを提供します。
次に、さまざまな FieldLayout を DataRecord に割り当てることを可能にするために AssigningFieldLayoutToItem イベントが発生します。最後に、 InitializeRecord イベントが発生します。
InitializeRecord イベントが DataRecords、 GroupByRecords および ExpandableFieldRecords に発生するため、 InitializeRecordEventArgs は基本の Record クラスを返すプロパティを公開します。したがって、派生した Record タイプのひとつに固有のプロパティにアクセスするためには、以下の例のコードに示すように、適切なタイプにキャストする必要があります。
private void OnInitializeRecord(object sender, InitializeRecordEventArgs e) { DataRecord dr = e.Record as DataRecord; if (dr != null) { Cell cell = dr.Cells["CustomerName"]; } }
以下の例の XAML は、 AutoGenerateFields 機能を使用する代わりに手動でフィールドを追加する方法を示します。追加のバインドされないフィールドを追加する方法も示します。
<igDP:XamDataGrid> <igDP:XamDataGrid.FieldLayoutSettings> <igDP:FieldLayoutSettings AutoGenerateFields="False"/> </igDP:XamDataGrid.FieldLayoutSettings> <igDP:XamDataGrid.FieldLayouts> <igDP:FieldLayout> <igDP:FieldLayout.Fields> <igDP:Field Name="CustomerName" Label="Customer Name"/> <igDP:Field Name="Address"/> <igDP:Field Name="City"/> <igDP:Field Name="MyExtraDataColumn" BindingType="Unbound" DataType="{x:Type sys:Decimal}"/> </igDP:FieldLayout.Fields> </igDP:FieldLayout> </igDP:XamDataGrid.FieldLayouts> </igDP:XamDataGrid>