前回に引き続きLongListSelectorを扱います。
前回の分だとLongListSelectorはただのヘッダー、フッダーのついたListBoxでしかありません。それをFlat(フラット)とすると今回紹介するのはGroup(グループ)のLongListSelectorです。
Groupは文字通りアイテムの一覧を特定のグループにまとめて表示することができます。
Windows Phoneのアプリの数が多くなるとグループ化されるあの動きがアプリでも実現できるのです。
GroupはFlatより構成が複雑になります。
XAMLの構成は以下のように、
<toolkit:LongListSelector x:Name="citiesListGropus" Background="Transparent"
ItemTemplate = "{StaticResource itemTemplate}"
ListHeaderTemplate = "{StaticResource header}"
ListFooterTemplate = "{StaticResource footer}"
GroupHeaderTemplate = "{StaticResource groupHeader}"
GroupItemTemplate = "{StaticResource groupItem}" >
GroupHeaderTemplateとGroupItemTemplateが追加されます。
・GroupHeaderTemplate
一覧の場面で表示されるグループキーの表示テンプレート
・GroupItemTemplate
グループヘッダーをクリックした際などに表示されるグループキーの一覧画面でのテンプレート
上記テンプレートのコードは以下のようになります。
<DataTemplate x:Key="groupHeader">
<Border Background="Aquamarine" Margin="6">
<TextBlock Text="{Binding Title}" FontSize="40" Foreground="Black"/>
</Border>
</DataTemplate>
<DataTemplate x:Key="groupItem" >
<Border Background="Aquamarine" Width="120" Height="80" Margin="6">
<TextBlock Text="{Binding Title}" FontSize="40" Foreground="BlueViolet"/>
</Border>
</DataTemplate>
以下の画像のようにGroupItemTemplateを横に並べたい場合は、
<toolkit:LongListSelector.GroupItemsPanel>
<ItemsPanelTemplate>
<toolkit:WrapPanel/>
</ItemsPanelTemplate>
</toolkit:LongListSelector.GroupItemsPanel>
</toolkit:LongListSelector>
GroupIemsPanelをいじってあげます。
C#のコードビハインド側もFlat版より複雑になります。
主な登場クラスは2つ
public class Book
{
public string name { get; set; }
public int price { get; set; }
public string author { get; set; }
public string type { set; get; }
}
Bookクラスは表示するアイテムを表すクラスで、前回のBooksクラスと同じ役目です。
そしてもうひとつ、
public class Group<T> : IEnumerable<T>
{
public Group(string name, IEnumerable<T> items)
{
this.Title = name;
this.Items = new List<T>(items);
}
public override bool Equals(object obj)
{
Group<T> that = obj as Group<T>;
return (that != null) && (this.Title.Equals(that.Title));
}
public string Title { get; set; }
public IList<T> Items { get; set; }
public IEnumerator<T> GetEnumerator()
{
return this.Items.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.Items.GetEnumerator();
}
}
グループを表すクラスです。プロパティとしてTitleとItemsを持つ列挙可能(IEnumerable)なクラスです。
Titleがグループのキー名、Itemsにそのグループに属するアイテムのリストが入ります。
今回の場合はBookクラスがItemsに入るわけですが、その辺のコードは以下、
var books = new List<Book>()
{
new Book() { name = "Silverlightで開発するデータ駆動アプリケーション", author="鈴木章太郎", type="Silverlight", price=3400},
new Book() { name = "プログラミングC# ", author="Jess Liberty", type="C#", price=4800},
new Book() { name = "C#クックブック", author="Jay Hilyard", type="C#", price=4600},
new Book() { name = "C#エッセンシャルズ", author="Brad Merill", type="C#", price=2600},
new Book() { name = "エッセンシャルSilverlight3", author="Ashraf Michail", type="Silverlight", price=3200},
new Book() { name = "Windows Azure入門", author="", type="Azure", price=2600},
new Book() { name = "究極のC#プログラミング", author="川俣 晶", type="C#", price=2980}
};
var groupBy = from book in books
group book by book.type into c
orderby c.Key
select new Group<Book>(c.Key, c);
this.citiesListGropus.ItemsSource = groupBy;
Bookを格納したリストをLinqでグリグリ回してItemsSourceに渡しております。
from book in books
booksをbookという変数に格納します。
group book by book.type into c
bookをtype毎にグループ化してそれを変数cとしてそれ以降のクエリ分に渡します。
into句はあまり使わないので出ると戸惑う私はLinqレベル1・・・。
orderby c.Key select new Group<Book>(c.Key, c);
c(bookをtypeでグループした集合)を並び替えて、Groupクラスに渡します。
引数のc.keyはたとえばc#という文字列が入り、cにtypeがC#のbookのコレクションが渡されます。
これでLongListSelectorの解説は終了です。
使えると便利なコントロールなので、サンプルを動かして理解を深めながら使いこなしましょう。
これまでのSilverlight Toolkitのコントロール紹介はこちら
Please give us your valuable comment