【问题标题】:Orderby() on observablecollections in silverlight does not workSilverlight 中 observablecollections 上的 Orderby() 不起作用
【发布时间】:2014-01-13 03:34:11
【问题描述】:

我的代码是,

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

这里,SelectedMenu 是要添加到集合中的新项目。 temp 是要交换的虚拟集合。而且,当我尝试将已排序的集合(如果有)转换为 ObservableCollection 时,它会引发一些异常。

有人可以帮我对集合进行排序并让我理解代码中的问题吗?

谢谢 马尼坎丹

【问题讨论】:

    标签: sorting observablecollection


    【解决方案1】:

    我知道了。

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

    这可行,并且 DestMenu 现在具有排序的集合。

    谢谢 马尼坎丹

    【讨论】:

    • 如果您有其他好的选择,请告诉我。
    【解决方案2】:

    很遗憾,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));
            }
      }
    

    【讨论】:

      猜你喜欢
      • 2014-07-18
      • 1970-01-01
      • 2014-10-21
      • 2018-05-08
      • 1970-01-01
      • 2017-02-08
      • 2016-06-18
      • 2016-06-15
      相关资源
      最近更新 更多