随笔 - 55  文章 - 15  trackbacks - 0
<2012年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

      
         前文再续,书接上一回。上次使得我们的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

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理