代码改变世界

windows phone 中ListBox采用多模板

  kaure  阅读(456)  评论(2编辑  收藏  举报

项目中有要用到一个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 }
复制代码


测试结果如下:

 

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示