Windows phoneでListBoxはマルチテンプレートを採用


プロジェクトの中で1つのListBoxの中の複数のテンプレートを使うところがあります.資料を調べて、本当に実現する方法があります.コードを与えます:
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     }