空洞的理论让人心烦。所以我打算从一个实例开始学习WPF。这个例子用来产生一个交替显示背景色的GridView。我看在网上有很多人都在问这样的问题,也有很多热心朋友的答复。但是所有这些答复都是基于MSDN网站上的描述。这是MSDN上的说明:http://msdn.microsoft.com/zh-cn/library/ms750769.aspx

 

我仍然使用这里例子作为对WPF的入门。当然了,我的重点不在如何实现交替显示背景色的GridView,而是以此入手,挖掘更多的WPF的知识。希望大家给出意见和建议,一起进步。

MSDN中有3种方法来实现了这一效果。这是其中的一个:派生一个新的ListView来实现交替产生背景色的效果。

这是定义的新的派生类源代码:

Code

 

     可以看见,这里首先定义了一个派生自ListView的新类,在新类中重写了PrepareContainerForItemOverride方法。先看看PrepareContainerForItemOverride方法。在MSDN中的解释是:为ListViewItem设置样式、模板和绑定。在这里,应该注意两点:

  1. 它的作用对象是ListViewItem。即仅对其中的一个项起作用。在这里例子里面,可以理解为当要表示某一行时可以为这一行指定样式、模板和绑定。因此,它的参数中应该包含对这个ListViewItem的引用。
  2. 从名字上来说,方法的目的是Prepare Container for Item。 因此,这里是通过重载来设定ListVirewItem的样式、模板和绑定,进而最终影响Container的表示方式。

再进一步可以看见一个ItemContainerGenerator.IndexFromContainer。IndexFromContainer可以知道这是用来取得该ListViewItem在整个Container中的索引。但是ItemContainerGenerator是什么东西呢?MSDN的解释很难理解。这是我的看法:

  1. ItemContainerGenerator是ListView的一个属性。它的作用在于“负责为其宿主(如 ItemsControl)生成 用户界面 (UI)。它维护控件数据视图中的项与对应的 UIElement 对象之间的关联。”。在这里我的理解是它可以定义ListView(准确的说应该是ItemsControl)与其中的ListViewItem的关系。
  2. ItemContainerGenerator作为一个维护ItemsControl与用户界面关系的桥梁,主要提供了以下方法:
    ContainerFromIndex     根据索引返回对应于ItemCollection中指定索引项的元素(DependencyObject)。
    ContainerFromItem      返回对应于指定项的UIElement。
    IndexFromContainer     返回对应于指定生成的 UIElement 的项的索引。
    ItemFromContainer      返回对应于指定生成的UIElement 的项。
  3. 可以看出这里有两个非常重要的实体关系:ListView的UI对象集合ItemsControl和值的集合ItemCollection。ItemContainerGenerator处理的就是这两者之间的关系。
  4. ItemsControl是所有集合控件的主要成员。它需要一个容器类型作为宿主。如:ListView和ComboBox。
  5. 这里的Container其实就是UIElement。也就是在画面上看见的一行。

到这里,再理解整个SubListView就很容易了。现在再来看我们在xaml中的实现

Code

这里需要注意几点:

  1. 第四行,这是在引用自己定义的程序集。需要注意xaml的名称空间和程序集的名称空间的区别,以及如何在xaml中引用程序集的名称空间。
  2. 第六行,定义了一个该Window的资源。
  3. 第十行,使用数据源绑定。关于资源和数据源绑定,以后将会做进一步的研究。

 以派生类的方式实现背景色交替显示的GridView源代码

posted on 2009-02-01 20:55  赵林  阅读(1203)  评论(0编辑  收藏  举报