2012-09-28 32 views
0

我有一个XamDataGrid显示类似于目录结构(文件夹可以有文件夹和文件里面)的分层数据。 我有一个单独的文本框外,我输入搜索字符串,并在TextChanged我应用RecordFilters到FieldLayouts网格。XamDataGrid - 过滤父级分层数据

要求是如果有一个匹配搜索字符串的文件,它的父文件夹(直到root)也应该是可见的。但其他文件不应该是可见的。

如果目录及其子目录和子文件与搜索字符串不匹配,则应将它们全部设为不可见。

如果目录匹配搜索字符串及其子目录和文件不匹配,则只有该基目录可见。

我所做的是将recordfilter应用于父级和子级fieldlayout,如果父目录与搜索不匹配,即使孩子与该字段匹配,它也会被隐藏。

什么是解决这个问题的最佳方法?

回答

1

您可以从Linq和递归开始。

喜欢的东西:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using rekie; 

namespace System.Collections.Generic 
{ 
    public static class FilterExtension 
    { 
    private static string _criteria; 

    public static IList<Node> FilterBy(this IList<Node> source, string criteria) 
    { 
     _criteria = criteria; 

     var copySource = 
     (from n in source 
     select n).ToList(); 

     foreach (var node in source) 
     { 
     if (node.Offspring != null) 
     { 
      FilterRecursion(node); 
     } 
     } 

     return copySource; 
    } 

    private static void FilterRecursion(Node parent) 
    { 
     foreach (var node in parent.Offspring) 
     { 
     if (node.Offspring != null) 
     { 
      FilterRecursion(node); 
     } 

     node.Visible = node.Text.Contains(_criteria); 
     } 

     parent.Visible = parent.Text.Contains(_criteria) || parent.Offspring.Where(o => o.Visible).Count() > 0; 
    } 
    } 
} 

namespace rekie 
{ 


    class Program 
    { 
    static void Main(string[] args) 
    { 
     var orig = Node.GetSome(); 
     var Results = orig.FilterBy("O.o"); 
    } 
    } 

    public class Node 
    { 
    public string Text { get; set; } 
    public IList<Node> Offspring { get; set; } 
    public bool Visible { get; set; } 

    public static IList<Node> GetSome() 
    { 
     return 
     new List<Node>() 
     { 
      new Node() 
      { 
      Text="Chidori", 
      Offspring=new List<Node>() 
       { 
       new Node(){ Text="Rasengan "} 
       } 
      }, 
      new Node() 
      { 
      Text="Kage Shuriken no Jutsu", 
      Offspring=new List<Node>() 
      { 
       new Node(){Text="Amagumo O.o"} 
      } 
      }, 
      new Node() 
      { 
      Text="Kage Bunshin no Jutsu", 
      Offspring=new List<Node>() 
      }, 
      new Node() 
      { 
      Text="Oiroke no Jutsu", 
      Offspring=new List<Node>() 
      { 
       new Node(){ Text="O.o"} 
      } 
      }, 
      new Node() 
      { 
      Text="Ranshinsho O.o", 
      Offspring=new List<Node>() 
      { 
       new Node(){ Text="Shikotsumyaku" }, 
       new Node(){ Text="Byakugan"} 
      } 
      } 
     }; 
    } 
    } 
}