我有一个XamDataGrid,它显示一个类似于目录结构的分层数据(文件夹里面可以有文件夹和文件)。 我在网格外面有一个单独的TextBox,我输入搜索字符串,在TextChanged中我将RecordFilters应用到FieldLayouts。
要求是如果存在与搜索字符串匹配的文件,则其父文件夹(直到root)也应该是可见的。但其他文件不应该是可见的。
如果目录及其子目录和子文件与搜索字符串不匹配,则它们都应该不可见。
如果目录与搜索字符串匹配且其子目录和文件不匹配,则只有该基目录可见。
我所做的是将recordfilter应用于父和子fieldlayout,如果父目录与搜索不匹配,即使子项与字段匹配,它也会被隐藏。
解决这个问题的最佳方法是什么?
答案 0 :(得分: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"}
}
}
};
}
}
}