Silverlight 4 におけるデータバインディングの強化 - CollectionViewSourceによるグルーピング

皆様、こんばんは!先日の、Expression Web 4のHTML5エディタアドインは、大変な反響を戴きました。私も色々作成していますので、今度どこかで、皆様にご紹介できればと思っております。

さて本日は、CollectionViewSourceによるGroupingについてご紹介しましょう。CollectionVeiwSourceとは、データグリッドとデータソースのコレクションをバインディングして表示させることができるオブジェクトです。オブジェクトにデータを保持させることにより、グルーピング等が簡単に行えます。

具体的なソースコードについては、やはりSilverlight 4 Training Kitが役に立ちます。C:\Silverlight4\Labs\DataValidation\Source\Ex02\end にあるEmployeeManagerというソリューションを開いて下さい。

EmployManager.csを開くと、下記のようにCollectionViewSourceで作られたデータが入ったオブジェクトが宣言されています。

Employeeクラスの宣言

 public ObservableCollection<Employee> Employees { get; set; }

そしてFillDataメソッド内で、従業員一人一人のデータを定義しています。

従業員のデータの定義

 private void FillData()
{
  Employees.Add(new Employee()
  {
    FirstName = "FName1",
    LastName = "LName1",
    PhoneNumber = "555-555-5555",
    Birthday = DateTime.Parse("1980/10/12"),
    Group = "IT",
    Income = 45000.00f,
    TaxPercent = 0.057f,
    NationalID = "IL1234567890"
      });
・・・

これでDataGridとバインディングをしています。ただ、CollectionViewSourceには、グルーピングという機能があります。これをXAMLの方で利用しています。

MainPage.xamlでUIを開いたらGroupボタンをダブルクリックして、MainPage.xaml.cs内の処理を見てみましょう。

image

MainPage.xamlとGroupボタン

Groupボタンのクリックイベントハンドラの処理

 private void btnGroup_Click(object sender, RoutedEventArgs e)
{
    System.Windows.Data.CollectionViewSource cvs =
        this.Resources["employeeManagerEmployeesViewSource"] 
    as System.Windows.Data.CollectionViewSource;
    if (cvs.View.GroupDescriptions.Count == 0)
        cvs.View.GroupDescriptions.Add
    (new System.Windows.Data.PropertyGroupDescription("Group"));
    else
        cvs.View.Refresh();
}

これにより、データが入っているオブジェクトに対してPropertyGroupDescription("Group") という機能を使用して、GroupというカテゴリでCollectionViewSourceの内容をカテゴライズできます。

そこで、グループ化したこのCollectionViewSourceのオブジェクトを、現状のDataGridに、バインディングさせてやると、このように、特定のグループのカテゴリでグルーピングされた状態での表示が可能となります。

image

Groupボタンクリック時の表示

この表示に関する実装は、ここでは一切していません。このように、DataGridも、DataSouceに合わせて自由に表示を変える、ということが、可能になりました。

参考 : データバインド機能に関する強化点は、バインディング機能が(TwoWay(双方向)、OneWay(一方向))ともに強化されたということになります。様々なオブジェクトデータとバインドできるようになったこと、そしてバインディングされたソース側のデータが変わることにより、ターゲット側のコントロールが、それに対応して変化するという形で、表現力が更に強化されているといえるでしょう。

以上です。いかがでしょうか?ぜひお試しください!

鈴木 章太郎