对ObservableCollection进行排序 - 最好的方法是什么?

时间:2011-04-12 06:15:04

标签: wpf mvvm

我有一个ObservableCollection,其中MyData是一个具有4个属性的类,即int id,string name,bool IsSelected,string IsVisible。

此ObservableCollection被绑定到带有复选框的组合框(例如,城市数据)。现在,当用户选中复选框时,下次打开下拉菜单时 - 所有选项都应按名称按升序排在最前面。

当用户在组合框中键入3个字符时,我也实现了自动完成,下拉列表将打开,首先显示所有选项,然后由3个字符开始的所有项目由用户键入。

我已经研究并实现了以下代码并且它工作正常,但我想知道这是否是最好的方法还是我能以更好的方式实现它,代码是:

        IEnumerable<MyData> sort;
        ObservableCollection<MyData> tempSortedCities = new ObservableCollection<MyData>();
        sort = City.OrderByDescending(item => item.IsSelected).ThenBy(item => item.Name.ToUpper()) ; 
       // City is my observablecollection<MyData> property in my Model binded to combobox in UI
        foreach (var item in sort)
            tempSortedCities.Add(item);


        City.Clear(); // City is my observablecollection<MyData> property in my Model
        City = tempSortedCities;
        tempSortedCities = null;
        sort = null;  

提前感谢您的时间!

1 个答案:

答案 0 :(得分:23)

ICollectionView似乎非常适合这种情况。它专门用于对集合进行排序,过滤和分组,而无需修改原始集合。

您可以使用以下代码获取集合ICollectionView的实例:

var sortedCities  = CollectionViewSource.GetDefaultView(City);

然后,您可以通过将SortDescription类型的实例添加到ICollectionView.SortDescriptions集合来设置排序:

sortedCities.SortDescriptions.Add(new SortDescription("IsSelected", ListSortDirection.Descending));
sortedCities.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

然后,您可以将ComboBox直接绑定到集合视图(而不是City集合),它将显示已排序的数据。