UWP中数据绑定模板选择
上文简单介绍了数据绑定。下面简单介绍一下数据模板选择。这是非常实用的,举个例子,我们做一个新闻app,来的数据源有的是纯文字(标题加文字内容),有的丰富一些(标题+文字内容+图片),还有的是(标题+文字内容+视频),那么如果用ListView这样的控件显示这样的数据源,数据模板的样式必须不同,这时候需要根据数据源的数据来判断使用何种模板进行显示。
上面是我做的一个小游戏,使用的是同一个ListView但根据后台数据不同显示了不同的模板。如何根据数据选择模板?其实并不难。首先建立一个类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
using
Windows.UI.Xaml;
using
Windows.UI.Xaml.Controls;
namespace
开心打地鼠.Models
{
class
MyTemplateSelector: DataTemplateSelector
{
public
DataTemplate DataTemplate0 {
get
;
set
; }
public
DataTemplate DataTemplate1 {
get
;
set
; }
public
DataTemplate DataTemplate2 {
get
;
set
; }
public
DataTemplate DataTemplate3 {
get
;
set
; }
public
DataTemplate DataTemplate4 {
get
;
set
; }
public
DataTemplate DataTemplate5 {
get
;
set
; }
public
DataTemplate DataTemplate6 {
get
;
set
; }
protected
override
DataTemplate SelectTemplateCore(
object
item, DependencyObject container)
{
ItemsControl.ItemsControlFromItemContainer(container)
as
GridView;
//int index = Gv.IndexFromContainer(container);
Level ThisLevel = item
as
Level;
//先判断 是否被锁定
if
(ThisLevel.Locked==
"1"
)
{
return
DataTemplate0;
//锁定,返回模板0
}
else
{
switch
(ThisLevel.Stars)
{
case
"0"
:
return
DataTemplate1;
//未锁定,返回模板1 0星
case
"1"
:
return
DataTemplate2;
//未锁定,返回模板2 1星
case
"2"
:
return
DataTemplate3;
//未锁定,返回模板3 2星
case
"3"
:
return
DataTemplate4;
//未锁定,返回模板4 3星
case
"4"
:
return
DataTemplate5;
//未锁定,返回模板5 4星
case
"5"
:
return
DataTemplate6;
//未锁定,返回模板6 5星
default
:
break
;
}
}
return
base
.SelectTemplateCore(item, container);
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<
Page.Resources
>
<!--关卡模板0-->
<
DataTemplate
x:Key
=
"DataTemplate0"
>
...
</
DataTemplate
>
<!--关卡模板1-->
<
DataTemplate
x:Key
=
"DataTemplate1"
>
...
</
DataTemplate
>
<!--关卡模板2-->
<
DataTemplate
x:Key
=
"DataTemplate2"
>
...
</
DataTemplate
>
<!--关卡模板3-->
<
DataTemplate
x:Key
=
"DataTemplate3"
>
...
</
DataTemplate
>
<!--关卡模板4-->
<
DataTemplate
x:Key
=
"DataTemplate4"
>
...
</
DataTemplate
>
<!--关卡模板5-->
<
DataTemplate
x:Key
=
"DataTemplate5"
>
...
</
DataTemplate
>
<!--关卡模板6-->
<
DataTemplate
x:Key
=
"DataTemplate6"
>
...
</
DataTemplate
>
<
Models:MyTemplateSelector
x:Key
=
"Selector"
x:Name
=
"MyTemplateSelector"
DataTemplate0
=
"{StaticResource DataTemplate0}"
DataTemplate1
=
"{StaticResource DataTemplate1}"
DataTemplate2
=
"{StaticResource DataTemplate2}"
DataTemplate3
=
"{StaticResource DataTemplate3}"
DataTemplate4
=
"{StaticResource DataTemplate4}"
DataTemplate5
=
"{StaticResource DataTemplate5}"
DataTemplate6
=
"{StaticResource DataTemplate6}"
>
</
Models:MyTemplateSelector
>
</
Page.Resources
>
|
最后在数据绑定的控件上指定selector(同时后台赋予DataContext),即完成了根据数据选择模板。(根据我的代码修改即可),其中代码段中ThisLevel就是后台绑定的数据对象,根据其中数据内容决定返回何种模板(根据需要)。
1
2
3
4
5
|
<
GridView
Margin
=
"20,0,20,0"
ItemTemplateSelector
=
"{StaticResource Selector}"
ItemsSource
=
"{Binding}"
Name
=
"GridView_Levels"
>
</
GridView
>
|