我必须在我的应用程序中实现“全局”搜索/过滤功能。每个包含信息列表的窗口(无论是DataGrid还是某个列表的其他实现)都必须有一个搜索框,并且如果用户在搜索框中输入文本,它将通过搜索任何内容来过滤该列表。我只想实现一次搜索逻辑。如何实现可用于不同类型对象的功能?
大多数情况下,这不一定会太困难。原因是大多数包含列表的窗口将基于相同的数据类型。这些都是ViewModels,每个ViewModel扩展ViewModelBase,ViewModelBase包含我将要搜索的数据。
一个基本的例子:
public class ZoneVm : ViewModelBase
{
// Zone specific functionality
}
public class UserVm : ViewModelBase
{
// User specific functionality
}
public class ViewModelBase : INotifyPropertyChanged
{
public string Name { get; set; }
public int Value { get; set; }
// The handy thing about the common view model base is that
// I can contain the model binding in a single place
// It will be easy to search List<ZoneVm> and List<UserVm> because
// they are both effectively List<ViewModelBase>.
}
的困难在于,我要寻找离群对象。某些窗口包含不需要扩展ViewModelBase的对象列表,因此我不会有这个可预测的属性列表进行搜索,例如,
public class PanelData // doesn't implement ViewModelBase :-(
{
public int SerialNumber { get; set; }
public Customer Customer { get; set; }
// other properties that I'll have to search/filter on
}
是否有这种任务的“最佳实践”方法?有没有解决这个问题的设计模式?我该如何处理搜索/过滤2个(可能更多)不同种类的列表?
你有没有考虑过使用反射?您可以使用Attribute标记这些属性,并在应用程序加载时解析它们,并为这些搜索/可过滤属性保存缓存的Accessors列表。 – dowhilefor 2012-07-19 08:55:54
Hi @dowhilefor(nice name,btw :-)),我没有考虑反思,但现在认为它可能是有用的。我可以迭代每个属性(不管它是什么),并将它的'ToString()'值与搜索项进行比较。随着我进一步探索,我会记住这一点。谢谢。 – DaveDev 2012-07-19 11:01:33