views:

1339

answers:

1

Hi there, actually Im not getting problems with sorting a normal ListView.ItemsSource, my issue actually comes when I have a IGrouping List as 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 ListView Column, direction = ascending, descending (depends last sorting)

so how can I set a ItemSource like the following : IList when T = myClass

Thanks in advance!

updated :

Modified the above snippet :

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 Im getting 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:

is so hard? :S

+2  A: 

Looking at the stack trace indicates that you're using a LINQ-to-SQL query as your data source for the List Box. It appears that you then dispose the DataContext on which the query was made. When you do the Refresh() on the DataView it is trying to re-run the query, but fails because the DataContext is disposed.

I quess what you need to do is capture the results of the query to a list before binding it to the ItemsControl. You can use the ToList() extension method to do this.

Samuel Jack