前文再續(xù),書接上一回。上次使得我們的GridView每個Item都有不同的尺寸,至少有點與眾不同了,今天我們更近一步,不僅尺寸不同,而且Item顯示的方式也不同。閑話少敘,先上圖:

我們看到,這是一個Grouped GridView,分成很多個組,這是截取的第一個組。我們看到,該組里面的第一個GridViewItem中的時間、圖片都與其他幾個不一樣,而且,第一個GridViewItem中還多了下面的一行1.Low:12312.現(xiàn)在我們就來看具體的步驟。
其實步驟很簡單,GridView、ListView這種接收Collection作為源的控件,都有一個ItemTemplateSelector的屬性,這個屬性接收一個DateTemplateSelector類型的值。我們要做的,就是寫一個類繼承自DataTemplateSelector,設(shè)置一系列的DataTemplate類型的屬性,并且重寫其中的虛函數(shù)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是我自己設(shè)置的用來辨別應該用哪個Template的,大家可以自行根據(jù)自己的類來進行判斷。這個方法的意思就是,將container中的所有item都遍歷一遍,然后為每個item選擇一種DataTemplate。
當我們完成了這個類之后,還要在XAML文件中進行配置。dataTemplate0--2 必須有相關(guān)聯(lián)的dataTemplate才能起作用,我們要在XAML文件中初始化這個類(當然你也可以在cpp文件中初始化,但是不如XAML直觀):
1 <local:myDataTemplateSelector x:Name="myDataTemplateSelector" dataTemplate1="{StaticResource SmallDateTemplate}" dataTemplate0="{StaticResource BigDateTemplate}" dataTemplate2="{StaticResource OthersTemplate}"/>
2
因為我們的類不是系統(tǒng)自帶的,所以在實例化的時候要加上一個local:,我們的實例命名為“myDataTemplateSelector",其中的SamllDateTemplate、BigDateTemplate和OthersTemplate都是我們在Page.Resource里面預先定義好的資源,所以,就可以用上面的代碼進行賦值。順序可以打亂,沒有影響。
然后,將這個DataTemplateSelector同GridView聯(lián)系起來:
1 <common:VariableGridView
2 ItemTemplateSelector="{StaticResource myDataTemplateSelector}"
3 />
因為我的VariableGridView是定義在common名字空間中的,所以前面應該加上common:。
至此,我們的ItemTemplateSelector就已經(jīng)完成了,當運行程序的時候,我們可以看到不同的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絕對是一個很復雜的東西,如何設(shè)置GridView,GridView中的屬性都代表神馬意思,下一章進行簡單的介紹。
posted on 2012-10-17 21:01
Dino-Tech 閱讀(1568)
評論(0) 編輯 收藏 引用 所屬分類:
Windows 8