前文再续,书接上一回。上次使得我们的GridView每个Item都有不同的尺寸,至少有点与众不同了,今天我们更近一步,不仅尺寸不同,而且Item显示的方式也不同。闲话少叙,先上图:
我们看到,这是一个Grouped GridView,分成很多个组,这是截取的第一个组。我们看到,该组里面的第一个GridViewItem中的时间、图片都与其他几个不一样,而且,第一个GridViewItem中还多了下面的一行1.Low:12312.现在我们就来看具体的步骤。
其实步骤很简单,GridView、ListView这种接收Collection作为源的控件,都有一个ItemTemplateSelector的属性,这个属性接收一个DateTemplateSelector类型的值。我们要做的,就是写一个类继承自DataTemplateSelector,设置一系列的DataTemplate类型的属性,并且重写其中的虚函数SelectTemplateCore()方法即可。具体步骤如下:
1 public ref class myDataTemplateSelector sealed : public Windows::UI::Xaml::Controls::DataTemplateSelector
2 {
3 public:
4 property Windows::UI::Xaml::DataTemplate^ dataTemplate0;
5 property Windows::UI::Xaml::DataTemplate^ dataTemplate1;
6 property Windows::UI::Xaml::DataTemplate^ dataTemplate2;
7 // 可以有很多个属性。
8 virtual Windows::UI::Xaml::DataTemplate^ SelectTemplateCore(Platform::Object^ item, Windows::UI::Xaml::DependencyObject^ container) override;
9
10 };
类定义:
1 Windows::UI::Xaml::DataTemplate^ myDataTemplateSelector::SelectTemplateCore(Platform::Object^ item, Windows::UI::Xaml::DependencyObject^ container)
2 {
3 {
4 auto _item = (Data::DataItem^)item;
5 switch (_item->TemplateFlag)
6 { case 0:
7 return dataTemplate0; break;
8 case 1
9 return dataTemplate1; break;
10 case 2:
11 return dataTemplate2;break;
12
13 default:
14 break;
15 }
16 return Windows::UI::Xaml::Controls::DataTemplateSelector::SelectTemplateCore(item,container);
17 }
}
其中第5行的TempFlag是我自己设置的用来辨别应该用哪个Template的,大家可以自行根据自己的类来进行判断。这个方法的意思就是,将container中的所有item都遍历一遍,然后为每个item选择一种DataTemplate。
当我们完成了这个类之后,还要在XAML文件中进行配置。dataTemplate0--2 必须有相关联的dataTemplate才能起作用,我们要在XAML文件中初始化这个类(当然你也可以在cpp文件中初始化,但是不如XAML直观):
1 <local:myDataTemplateSelector x:Name="myDataTemplateSelector" dataTemplate1="{StaticResource SmallDateTemplate}" dataTemplate0="{StaticResource BigDateTemplate}" dataTemplate2="{StaticResource OthersTemplate}"/>
2
因为我们的类不是系统自带的,所以在实例化的时候要加上一个local:,我们的实例命名为“myDataTemplateSelector",其中的SamllDateTemplate、BigDateTemplate和OthersTemplate都是我们在Page.Resource里面预先定义好的资源,所以,就可以用上面的代码进行赋值。顺序可以打乱,没有影响。
然后,将这个DataTemplateSelector同GridView联系起来:
1 <common:VariableGridView
2 ItemTemplateSelector="{StaticResource myDataTemplateSelector}"
3 />
因为我的VariableGridView是定义在common名字空间中的,所以前面应该加上common:。
至此,我们的ItemTemplateSelector就已经完成了,当运行程序的时候,我们可以看到不同的Item有不同的DataTemplate。
另外,GridView还有一个GroupTemplateSelector,但是该属性貌似不起作用,在微软官方论坛上问了问题,也没有人回应。把问题贴在这里,如果有人看到,请帮忙解答一下,谢谢!
0
I find this question in C# forum, but I didn't find the answer.
My question is I want to select different GroupStyle for a grouped GridView control. When I derive a class from GroupStyleSelector and override virtual method SelectGroupStyleCore(), I only can return a default GroupStyle. My code looks like this:
public ref class myGroupStyleSelector sealed : public Windows::UI::Xaml::Controls::GroupStyleSelector
{
public:
property Windows::UI::Xaml::Controls::GroupStyle^ groupTemplate0;
property Windows::UI::Xaml::Controls::GroupStyle^ groupTemplate1;
property Windows::UI::Xaml::Controls::GroupStyle^ groupTemplate2;
virtual Windows::UI::Xaml::Controls::GroupStyle^ SelectGroupStyleCore(Platform::Object^ group, unsigned int level) override
{
auto collectionViewGroup = safe_cast<Windows::UI::Xaml::Data::ICollectionViewGroup^>(group);
if(collectionViewGroup != nullptr)
{
//ItemsContainer include Items
auto groupVM = safe_cast<ItemsContainer^>(collectionViewGroup->Group);
if(groupVM != nullptr)
{
// ContainerGroup is a Groups enum, indicate which group is
switch(groupVM->ContainerGroup)
{
case Groups::Group1:
return groupTemplate0;
break;
case Groups::Group2:
return groupTemplate1;
break;
default:
return groupTemplate2;
break;
}
}
return Windows::UI::Xaml::Controls::GroupStyleSelector::SelectGroupStyleCore(group, level);
}
// If I write it like this, I always get groupTemplate1, why?
return groupTemplate1;
}
};
I set a break point at beginning of this class, and I notify when the first and second time this method was invoked, the group and level is 0, at the third time level is 1, but I only get goupTemplate1. Is that I forgot something?
Thanks!
下一章提示:GridView绝对是一个很复杂的东西,如何设置GridView,GridView中的属性都代表神马意思,下一章进行简单的介绍。
posted on 2012-10-17 21:01
Dino-Tech 阅读(1548)
评论(0) 编辑 收藏 引用 所属分类:
Windows 8