FlexGrid for WPF 帮助文档
过滤数据(使用ICollectionView)

ICollectionView接口通过其Filter属性支持数据过滤。Filter属性指定一个方法,该方法将为集合中的每一个数据项进行调用。如果方法返回true,则该项目包含在视图中。如果方法返回false,则该项目将被过滤掉。(这种方法被称为断言)。

该文档包含的MainTestApplication示例包括一个SearchBox控件,该控件包含一个文本框,在此用户可以键入一个待搜索的值,除此之外,还包含了一个Timer。定时器提供了一个小的延迟,允许用户在输入待搜索值时,不会再每一个字符键入时立刻重复应用搜索。

当用户停止输入,定时器经过一段时间后将通过以下代码应用过滤器:

C#
拷贝代码
_view.Filter = null;
_view.Filter = (object item) =>
{
  var srch = _txtSearch.Text;
  if (string.IsNullOrEmpty(srch))
  {
    return true;
  }
  foreach (PropertyInfo pi in _propertyInfo)
  {
    var value = pi.GetValue(item, null) as string;
    if (value != null &&
        value.IndexOf(srch, StringComparison.OrdinalIgnoreCase) > -1)
    {
      return true;
    }
  }
  return false;
};

注意这里代码是如何使用一个lambda函数设置Filter属性的。我们可以提供一个单独的方法,但这种符号通常更方便,因为它是简洁的,并且允许我们使用本地变量,如果我们需要它们。

lambda函数接受一个项目作为一个参数,获取该对象的指定属性的值,如果任何对象的属性包含待搜索的字符串则返回true。

例如,如果对象是“歌曲”类型,并且指定的属性是“标题”,“专辑”,“艺术家”,如果在歌曲的标题,专辑或艺术家中包含待搜索的字符串则返回true。这是一个功能强大且易于使用的搜索机制,类似于一个用于在苹果的iTunes应用程序。

一旦应用了过滤器,grid(以及其他绑定到相同的ICollectionView对象的控件)都将仅显示由该过滤器筛选出来的项目,以反映该变化。
注意过滤和分组可以一起工作。下图(来自于MainTestApplication 示例)显示一个非常大的歌曲列表,并应用了一个过滤器:

The image shows the filter set to the word “Water.” The filter looks for matches in all fields (song, album, artist), so all “Creedence Clearwater Revival” songs are automatically included.

Notice the status label above the grid. It automatically updates whenever the list changes, so when the filter is applied the status updates to reflect the new filter. The routine that updates the status uses LINQ to calculate the number of artists, albums, and songs selected, as well as the total storage and play time. The song status update routine is implemented as follows:

C#
拷贝代码
// update song status
 void UpdateSongStatus()
 {
   var view = _flexiTunes.ItemsSource as ICollectionView;
   var songs = view.OfType<Song>();
   _txtSongs.Text = string.Format(
      "{0:n0} Artists; {1:n0} Albums; {2:n0} Songs; " +
      "{3:n0} MB of storage; {4:n2} days of music.",
     (from s in songs select s.Artist).Distinct().Count(),
     (from s in songs select s.Album).Distinct().Count(),
     (from s in songs select s.Name).Count(),
     (double)(from s in songs select s.Size/1024.0/1024.0).Sum(),
     (double)(from s in songs select s.Duration/3600000.0/24.0).Sum());
 }

This routine is not directly related to the grid, but is listed here because it shows how you can leverage the power of LINQ to summarize status information that is often necessary when showing grids bound to large data sources.

The LINQ statement above uses the Distinct and Count commands to calculate the number of artists, albums, and songs currently exposed by the data source. It also uses the Sum command to calculate the total storage and play time for the current selection.

查看其它

 

 


产品网站:http://www.gcpowertools.com.cn  |  咨询热线:4006576008   |   ©2015 西安葡萄城