【问题标题】: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));
}
}