对Silverlight中的observablecollections的Orderby()不起作用

时间:2013-07-17 13:56:55

标签: sorting observablecollection

我的代码是,

DestMenu.Add(SelectedMenu);
ObservableCollection<MenuModel> temp = 
(ObservableCollection<MenuModel>)DestMenu.OrderBy(p =>(p.MenuName));
DestMenu = temp;

此处,SelectedMenu是要添加到集合的新项目。 temp是虚拟集合交换。并且,当我尝试将已排序的集合(如果有的话)转换为ObservableCollection时,它会抛出一些异常。

有人可以帮我分类收集并让我理解代码中的问题吗?

由于 Manikandan

2 个答案:

答案 0 :(得分:1)

我得到了诀窍。

DestMenu.Add(SelectedMenu);
IEnumerable<MenuModel> temp = DestMenu.OrderBy(p =>(p.MenuName));
DestMenu = new ObservableCollection<MenuModel>(temp);

这有效,DestMenu现在有了已排序的集合。

由于 Manikandan

答案 1 :(得分:0)

令人遗憾的是,OrderBy扩展方法不对集合进行排序,但返回IOrderdEnumerable以便处理此问题,您应该执行以下操作

DestMenu = new ObservableCollection<MenuModel>(DestMenu.OrderBy(o=>o.MenuName));

当然使用ObservableCollection时,您需要在视图上更新项目,当您使用这种排序方法时,实际上不会发生这些项目,因为ObservableCollection会更新视图中的项目,因为它会触发CollectionChanged事件,但实际上我们已经更改了Collection本身而不是集合中的元素所以如果你做了以下

会很好
public YourClass : INotifyPropertyChanged
{
  void YourMethod()
   {
      DestMenu = new ObservableCollection<MenuModel>(DestMenu.OrderBy(o=>o.MenuName));
      RaisePropertyChanged("DestMenu");
   }


  event PropertyChangedEventHandler PropertyChanged;

  void RaisePropertyChanged(string PropertyName)
  {
    var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(PropertyName));
        }
  }