Сортировка WPF ListView с помощью System.Linq.IGrouping <строка, класс T> - PullRequest
3 голосов
/ 25 февраля 2009

На самом деле у меня нет проблем с сортировкой обычного ListView.ItemsSource, моя проблема возникает, когда у меня есть список IGrouping в качестве ItemSource или SelectedItems, я использую следующий фрагмент:

    private void Sort(string sortBy, ListSortDirection direction)
    {
        lastDirection = direction;
        ICollectionView dataView = CollectionViewSource.GetDefaultView(this.ItemsSource);

        dataView.SortDescriptions.Clear();
        SortDescription sd = new SortDescription(sortBy, direction);
        dataView.SortDescriptions.Add(sd);
        dataView.Refresh();
    }

когда sortBy = некоторый столбец ListView, направление = возрастание, убывание (зависит от последней сортировки)

так как я могу установить ItemSource следующим образом: IList когда T = myClass

Заранее спасибо!

обновлено:

Изменен приведенный выше фрагмент:

private void Sort(string sortBy, ListSortDirection direction)
{
    lastDirection = direction;
    ICollectionView dataView;
    if (this.Name.Equals("dlstPlantillas"))
    {
        List<Plantilla> newItemSource = new List<Plantilla>();
        var source = this.ItemsSource;

        foreach (var group in source)
        {
            System.Linq.IGrouping<string, Plantilla> groupCast = group as System.Linq.IGrouping<string, Plantilla>;
            if (null == groupCast) return;
            foreach (Plantilla item in groupCast)
            {
                newItemSource.Add(item);
            }
        }
         dataView = CollectionViewSource.GetDefaultView(newItemSource);
    }
    else
    {
        dataView = CollectionViewSource.GetDefaultView(this.ItemsSource);
    }          

    dataView.SortDescriptions.Clear();
    SortDescription sd = new SortDescription(sortBy, direction);
    dataView.SortDescriptions.Add(sd);
    dataView.Refresh();
}

На самом деле я получаю этот стек:

System.ObjectDisposedException was unhandled by user code 
   Message = "Unable to access the deleted object. \ R \ nNombre object: 'It has a DataContext accessed after Dispose..'" 
   Source = "System.Data.Linq" 
   ObjectName = "It has been a DataContext accessed after Dispose." 
   Stacktrace: 
        in System.Data.Linq.DataQuery `1.System.Collections.IEnumerable.GetEnumerator () 
        in SRIMedico.com.SortableListView.Sort (String Sort, ListSortDirection direction) in D: \ cs_InformeMedico \ app \ SortableListView.cs: line 219 
        in SRIMedico.com.SortableListView.GridViewColumnHeaderClickedHandler (Object sender, RoutedEventArgs e) in D: \ cs_InformeMedico \ app \ SortableListView.cs: line 163 
        in System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object target, RoutedEventArgs routedEventArgs) 
        in System.Windows.EventRoute.InvokeHandlersImpl (Object source, RoutedEventArgs args, Boolean reRaised) 
        in System.Windows.UIElement.RaiseEventImpl (DependencyObject sender, RoutedEventArgs args) 
        in System.Windows.UIElement.RaiseEvent (RoutedEventArgs e) 
        in System.Windows.Controls.Primitives.ButtonBase.OnClick () 
        in System.Windows.Controls.GridViewColumnHeader.ClickImplement () 
        in System.Windows.Controls.GridViewColumnHeader.OnClick () 
        in System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp (MouseButtonEventArgs e) 
        in System.Windows.Controls.GridViewColumnHeader.OnMouseLeftButtonUp (MouseButtonEventArgs e) 
        in System.Windows.UIElement.OnMouseLeftButtonUpThunk (Object sender, MouseButtonEventArgs e) 
        in System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (Delegate genericHandler, Object genericTarget) 
        in System.Windows.RoutedEventArgs.InvokeHandler (Delegate handler, Object target) 
        in System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object target, RoutedEventArgs routedEventArgs) 
        in System.Windows.EventRoute.InvokeHandlersImpl (Object source, RoutedEventArgs args, Boolean reRaised) 
        in System.Windows.UIElement.ReRaiseEventAs (DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) 
        in System.Windows.UIElement.CrackMouseButtonEventAndReRaiseEvent (DependencyObject sender, MouseButtonEventArgs e) 
        in System.Windows.UIElement.OnMouseUpThunk (Object sender, MouseButtonEventArgs e) 
        in System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (Delegate genericHandler, Object genericTarget) 
        in System.Windows.RoutedEventArgs.InvokeHandler (Delegate handler, Object target) 
        in System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object target, RoutedEventArgs routedEventArgs) 
        in System.Windows.EventRoute.InvokeHandlersImpl (Object source, RoutedEventArgs args, Boolean reRaised) 
        in System.Windows.UIElement.RaiseEventImpl (DependencyObject sender, RoutedEventArgs args) 
        in System.Windows.UIElement.RaiseEvent (RoutedEventArgs args, Boolean trusted) 
        in System.Windows.Input.InputManager.ProcessStagingArea () 
        in System.Windows.Input.InputManager.ProcessInput (InputEventArgs input) 
        in System.Windows.Input.InputProviderSite.ReportInput (InputReport inputReport) 
        in System.Windows.Interop.HwndMouseInputProvider.ReportInput (IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 and Int32 wheel) 
        in System.Windows.Interop.HwndMouseInputProvider.FilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) 
        in System.Windows.Interop.HwndSource.InputFilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) 
        in MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) 
        in MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) 
        in System.Windows.Threading.ExceptionWrapper.InternalRealCall (Delegate callback, Object args, Boolean isSingleParameter) 
        in System.Windows.Threading.ExceptionWrapper.TryCatchWhen (Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
        in System.Windows.Threading.Dispatcher.WrappedInvoke (Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
        in System.Windows.Threading.Dispatcher.InvokeImpl (DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter) 
        in System.Windows.Threading.Dispatcher.Invoke (DispatcherPriority priority, Delegate method, Object arg) 
        in MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
        in MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG & msg) 
        in System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame frame) 
        in System.Windows.Threading.Dispatcher.PushFrame (DispatcherFrame frame) 
        in System.Windows.Window.ShowHelper (Object booleanBox) 
        in System.Windows.Window.Show () 
        in System.Windows.Window.ShowDialog () 
   InnerException:

так сложно? : S

1 Ответ

2 голосов
/ 23 марта 2009

Просмотр трассировки стека показывает, что вы используете запрос LINQ-to-SQL в качестве источника данных для списка. Похоже, что вы затем располагаете DataContext, по которому был сделан запрос. Когда вы выполняете Refresh () в DataView, он пытается повторно выполнить запрос, но не удается, потому что DataContext расположен.

Я прошу вас записать результаты запроса в список перед привязкой его к ItemsControl. Для этого вы можете использовать метод расширения ToList ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...