Sort WPF ListView with System.Linq.Grouping <string, class T>

Actually, I do not get problems sorting a regular ListView.ItemsSource, my problem actually arises when I have an IGrouping List as an ItemSource or SelectedItems, Im using the following snippet:

    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();
    }

when sortBy = some column of ListView, direction = ascending, descending (depends on the last sort)

since I can set ItemSource as follows: IList when T = myClass

Thanks in advance!

updated:

Modified snippet above:

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();
}

Actually I get this stack:

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:

so hard ?: S

+3
source share
1 answer

, , LINQ-to-SQL. -, DataContext, . Refresh() DataView, , , DataContext .

, , ItemsControl. ToList().

+2

Source: https://habr.com/ru/post/1703817/


All Articles