2011-07-31 35 views
0

好吧,我想我在这里做得不对。异常,而试图手动排序PagedCollectionView

我使用的是PagedCollectionView映射到一个自定义类型的的ObservableCollection。我希望能够在用户尝试对DataGrid列进行排序时手动对基础集合进行排序。

我做了以下内容:

obs = new ObservableCollection<Seats>(arrSeats); 
    view = new PagedCollectionView(obs); 

    INotifyCollectionChanged sortchangeNotifier = view.SortDescriptions as INotifyCollectionChanged; 
    sortchangeNotifier.CollectionChanged += new NotifyCollectionChangedEventHandler(sortchangeNotifier_CollectionChanged); 
    grdData.ItemsSource = view; 

    void sortchangeNotifier_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     // What to do here? 
    } 

事件处理程序只要单击列标题被正确调用。但是,每当我尝试修改ObservableCollection时,我都会得到以下例外情况:

刷新被延迟时,无法更改或检查PagedCollectionView的内容或当前位置。

我希望能够实现自己的自定义排序算法。有任何想法吗?

谢谢!

编辑

那么,这是特别疯狂,但是当我在事件处理方法的try/catch块缠上了我的密码,更改将实际应用。有任何想法吗 :) ?

回答

1

你真的想解决是有一个PagedCollectionView的自定义排序的问题 -

“我使用映射到一个自定义类型的一个ObservableCollection一个PagedCollectionView我希望能够手动排序底层集合每当用户尝试对DataGrid列进行排序时。“

定制/扩展PagedCollectionView是做到这一点的方式。当我有需要做同样的我创建的IComparer

的字典
public Dictionary<string, IComparer<object>> CustomSortFunctions 
    { 
     get 
     { 
      if (this.customSortFunctions == null) 
      { 
       this.customSortFunctions = new Dictionary<string, IComparer<object>>(); 
      } 
      return this.customSortFunctions; 
     } 
    } 

使得每对的关键是为了对应一个DataGridColumn.SortMemberPath。对于您希望自定义排序的任何列,请添加一个合适的值对。

要利用此字典,请修改PagedCollectionView的SortList方法以检查自定义比较器以排序(然后按适用方向排序)。例如:

if (this.CustomSortFunctions.ContainsKey(description.PropertyName)) 
{ 
    source = source.OrderBy(a => a, this.CustomSortFunctions[description.PropertyName]); 
} 

当用户对数据网格进行“排序”时,将会发生所需的排序。

您的出发点是PagedCollectionView--其源代码包含在Silverlight Toolkit的源代码中(在Toolkit/Systems.Windows.Data/PagedCollection中)。

0

嘛的CollectionView和的ObservableCollection齐头并进任何更改通知。因此,对两个变更通知同时进行的任何更改都会导致异常。

我们将不得不采取这种不同的方法。

  1. 对于WPF - 使用DataGrid.Sorting事件调用并在其事件处理函数中执行e.Handled = true。这会停止datagrid的本地排序。在e.Handled = true之前,按照自己的喜好进行自定义排序。

  2. 为Silverlight - 使用Dispatcher.BeginInvoke()和delgate您的自定义任务排序那里。使用后台调度程序优先级。

让我知道如果这些帮助。

+0

silverlight网格没有排序事件。 – SiN