FlexGrid for WPF
共通作業が終わったので、FlexGrid for WPFのサンプルに必要な作業を開始します。
FlexGridの設置
ツールボックスに「WPFコンポーネント」からC1FlexGridを追加し、さらにメインフォームにドラッグ&ドロップで設置します。
<Window x:Class="Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml" Title="MainWindow" Height="300" Width="300"> <Grid> <c1:C1FlexGrid HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding Items}" Margin="10" IsReadOnly="True" AutoGenerateColumns="True" > </c1:C1FlexGrid> </Grid> </Window>
ItemSourceプロパティにBinding設定を忘れずに指定しましょう。
Binding設定
MainWindow.xamlのコードビハインド側に、ロジックからのItemsをBindingするコードを追記します。直接AEDModel.vbを使うのではなく、間にMainViewModelクラスをはさんでいる点に注意してください。MainViewModelクラスは、Application.vbでMainVM変数にインスタンシング化して格納されています。
Namespace Views Public Class MainWindow Public Sub New() InitializeComponent() Me.DataContext = Application.MainVM SelectData() End Sub Private Async Sub SelectData() Await Application.MainVM.SelectData() End Sub End Class End Namespace
MainWindowクラスがnewされると、DataContextにMainViewModelクラスのインスタンスを設定し、それからSelectDataメソッドを呼び出します。SelectDataメソッドで値が設定されるItemsプロパティの内容は、MainWindow.xamlで指定してあるようにFlexGridにBindingされているので、Itemsプロパティの内容が変化すれば即座にFlexGridの表示に反映されます。
実行
FlexGridには、最小の手順で結果を得られるようにAutoGenerateColumnsという機能があり、AutoGenerateColumnsプロパティをTrueにすることで、Bindingしたプロパティ構造を自動的に列に展開する機能があります。
そのため、事前に定義をしなくても一覧表示が可能です。
表示列の明示的指定
AutoGenerateColumns機能を使うと不要な列を非表示にしたり、列の順番の初期位置を変更したりできません。そのような要望がある場合は、明示的に列と列に表示するプロパティ値を指定します。
<Window x:Class="Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml" Title="{Binding Items[0].Perfecture}" Height="300" Width="300"> <Grid> <c1:C1FlexGrid HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding Items}" Margin="10" IsReadOnly="True" AutoGenerateColumns="False" > <c1:C1FlexGrid.Columns> <c1:Column Header="設備写真"> <c1:Column.CellTemplate> <DataTemplate> <Image Source="{Binding PhotoOfAedUrl}" /> </DataTemplate> </c1:Column.CellTemplate> </c1:Column> <c1:Column Binding="{Binding LocationName}" Header="施設名" Width="150" /> <c1:Column Binding="{Binding City}" Header="市町村区" Width="50" /> <c1:Column Binding="{Binding AddressArea}" Header="住所" Width="150" /> <c1:Column Binding="{Binding Latitude}" Header="緯度" /> <c1:Column Binding="{Binding Longitude}" Header="経度" /> </c1:C1FlexGrid.Columns> </c1:C1FlexGrid> </Grid> </Window>
<c1:C1FlexGrid.Columns>タグの中に必要な列の<c1:Column>タグを定義してあります。忘れてはいけないのは、AutoGenerateColumnsプロパティをFalseにすることです。
今回は、設備写真の画像URLをImageとして表示するように列属性の変更も行っています。
実行
かなり最適化された一覧表示ができあがりました。