我很确定您正在寻找CollectionViewSource。 Bea 在链接中提供了一些有关如何使用它的信息。
从 MVVM 立场来看,这就是我在 ViewModel 中使用 ICollectionView 的方式。 _scriptService.Scripts 属性是一个 ObservableCollection<T> 被包裹在一个返回给视图的 ICollectionView 中。 _view.Filter 用于过滤 ICollection 中的项目,从而更改视图。类似于输入“acc”并查看列表中所有以“acc”开头的项目。
public class ScriptRepositoryViewModel : AViewModel
{
private readonly IUnityContainer _container;
private readonly IScriptService _scriptService;
private readonly IEventAggregator _eventAggregator;
private ICollectionView _view;
public ScriptRepositoryViewModel(IUnityContainer container, IScriptService scriptService, IEventAggregator eventAggregator)
{
_container = container;
_scriptService = scriptService;
_eventAggregator = eventAggregator;
}
public ICollectionView Scripts
{
get
{
if (_view == null)
{
_view = CollectionViewSource.GetDefaultView(_scriptService.Scripts);
_view.Filter = Filter;
}
return _view;
}
}
}
下面是负责过滤的代码,它通过 Prism 中的 DelegateCommand 进入,它驻留在同一个 ViewModel 中。
#region SearchCommand
public DelegateCommand<object> SearchCommand { get; private set; }
private String _search = String.Empty;
private void Search(object commandArg)
{
_search = commandArg as String;
_view.Refresh();
}
public bool Filter(object arg)
{
bool usingPrefix;
IScript script = arg as IScript;
if (script.FileType == ConvertPrefixToFileType(_search, out usingPrefix))
{
if (_search.Length == 2)
return true;
else
return CheckProperties(script, usingPrefix);
}
else
{
if (usingPrefix)
return false;
else
return CheckProperties(script, usingPrefix);
}
}
有了基本功能并利用ICollectionView,您可以按如下方式应用排序......
_view.SortDescriptions.Add(new SortDescription("PropertyName", direction));
更多关于排序行为的信息可以在here找到,因为有一些性能方面的想法需要牢记。