Windows phoneでListBoxはマルチテンプレートを採用
プロジェクトの中で1つのListBoxの中の複数のテンプレートを使うところがあります.資料を調べて、本当に実現する方法があります.コードを与えます:
ps:テストだったので、ネーミングなんて気にしなかったので、お許しください
1:MultiTemplatedListBox
ListBoxから継承し、PrepareContainerForItemOverrideフェーズでデータをチェックし、どのテンプレートを選択するかを決定します.
2:MultiTemplatedListBoxDataは、選択したテンプレートのベースクラスを決定するために使用されます.
3:テストページXAML
4:テストコード
ps:テストだったので、ネーミングなんて気にしなかったので、お許しください
1:MultiTemplatedListBox
ListBoxから継承し、PrepareContainerForItemOverrideフェーズでデータをチェックし、どのテンプレートを選択するかを決定します.
1 public class MultiTemplatedListBox : ListBox
2 {
3 public DataTemplate ListItemTemplate1 { get; set; }
4 public DataTemplate ListItemTemplate2 { get; set; }
5
6 public MultiTemplatedListBox() : base() { }
7
8 DataTemplate SelectTemplate(MultiTemplatedListBoxData data)
9 {
10 if (data.TemplateOrder == 1)
11 return ListItemTemplate1;
12 else
13 return ListItemTemplate2;
14 }
15
16 protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
17 {
18 base.PrepareContainerForItemOverride(element, item);
19 ListBoxItem listBoxItem = element as ListBoxItem;
20
21 if (listBoxItem != null)
22 {
23 listBoxItem.ContentTemplate = SelectTemplate((MultiTemplatedListBoxData)item);
24 }
25 }
26 }
2:MultiTemplatedListBoxDataは、選択したテンプレートのベースクラスを決定するために使用されます.
1 public class MultiTemplatedListBoxData
2 {
3 public int TemplateOrder { get; set; }
4 public MultiTemplatedListBoxData()
5 {
6 TemplateOrder = 1;
7 }
8 }
3:テストページXAML
<lc:MultiTemplatedListBox x:Name="Test">
<lc:MultiTemplatedListBox.ListItemTemplate1>
<DataTemplate>
<Grid Background="Red">
<TextBlock Text="{Binding Name1}"></TextBlock>
</Grid>
</DataTemplate>
</lc:MultiTemplatedListBox.ListItemTemplate1>
<lc:MultiTemplatedListBox.ListItemTemplate2>
<DataTemplate>
<Grid Background="Blue">
<TextBlock Text="{Binding Name2}"></TextBlock>
</Grid>
</DataTemplate>
</lc:MultiTemplatedListBox.ListItemTemplate2>
</lc:MultiTemplatedListBox>
4:テストコード
1 public partial class AATest: PhoneApplicationPage
2 {
3 public AATest()
4 {
5 InitializeComponent();
6 List<MultiTemplatedListBoxData> aa = new List<MultiTemplatedListBoxData>();
7 for (int i = 0; i < 10; i++)
8 {
9 if (i % 2 == 0)
10 aa.Add(new Test1() { TemplateOrder = 1, Name1 = i.ToString() + " Name1!!!" });
11 else
12 aa.Add(new Test2() { TemplateOrder = 2, Name2 = i.ToString() + " Name2!!!" });
13 }
14 this.Test.ItemsSource = aa;
15 }
16 }
17
18 public class Test1 : MultiTemplatedListBoxData
19 {
20 public string Name1 { get; set; }
21 }
22
23 public class Test2 : MultiTemplatedListBoxData
24 {
25 public string Name2 { get; set; }
26 }