zac*_*ary 20 linq silverlight observablecollection
我有一个可观察的集合,我用linq对它进行排序.一切都很好,但我遇到的问题是如何对实际的可观察集合进行排序?相反,我刚刚结束了与一些IEnumerable的事情,我最终结算的收集和添加的东西回.这不利于性能.有谁知道更好的方法吗?
moo*_*ock 15
如果您使用的是Silverlight 3.0,那么使用CollectionViewSource是最简洁的方法.请参考以下示例:(也可以通过xaml完成)
ObservableCollection<DateTime> ecAll = new ObservableCollection<DateTime>();
CollectionViewSource sortedcvs = new CollectionViewSource();
sortedcvs.SortDescriptions.Add(new System.ComponentModel.SortDescription("Date",
System.ComponentModel.ListSortDirection.Ascending));
sortedcvs.Source = ecAll;
ListBoxContainer.DataContext = sortedcvs;
Run Code Online (Sandbox Code Playgroud)
并在相应的xaml集中
ItemsSource="{Binding}"
Run Code Online (Sandbox Code Playgroud)
对于ListBox或任何ItemsControl派生控件
由于该集合不提供任何Sort机制,这可能是最实用的选择.你可以使用Moveetc 手动实现排序,但它可能比这样做慢.
var arr = list.OrderBy(x => x.SomeProp).ToArray();
list.Clear();
foreach (var item in arr) {
list.Add(item);
}
Run Code Online (Sandbox Code Playgroud)
此外,您可能会考虑在排序时解锁任何UI元素(通过任一方法),您只需重新绑定一次:
有趣的是,如果是这样BindingList<T>,您可以使用RaiseListChangedEvents最小化通知的数量:
var arr = list.OrderBy(x => x).ToArray();
bool oldRaise = list.RaiseListChangedEvents;
list.RaiseListChangedEvents = false;
try {
list.Clear();
foreach (var item in arr) {
list.Add(item);
}
} finally {
list.RaiseListChangedEvents = oldRaise;
if (oldRaise) list.ResetBindings();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25851 次 |
| 最近记录: |