Example #1
0
        private void listMessagesColumnHeader_Click(object sender, RoutedEventArgs e)
        {
            // Sort the messages by the clicked on column
            GridViewColumnHeader column = (sender as GridViewColumnHeader);
            string sortBy = column.Tag.ToString();

            if (listViewSortCol != null)
            {
                AdornerLayer.GetAdornerLayer(listViewSortCol).Remove(listViewSortAdorner);
                listMessages.Items.SortDescriptions.Clear();
            }

            ListSortDirection newDir = ListSortDirection.Ascending;

            if (listViewSortCol == column && listViewSortAdorner.Direction == newDir)
            {
                newDir = ListSortDirection.Descending;
            }

            listViewSortCol     = column;
            listViewSortAdorner = new SortAdorner(listViewSortCol, newDir);
            AdornerLayer.GetAdornerLayer(listViewSortCol).Add(listViewSortAdorner);
            listMessages.Items.SortDescriptions.Add(new SortDescription(sortBy, newDir));
        }
Example #2
0
        private void SortMessages(string property, ListSortDirection direction, bool ifNoneAlready = false)
        {
            var targetCol = ((GridView)listMessages.View).Columns.Select(c => (GridViewColumnHeader)c.Header)
                            .First(h => h.Tag.ToString() == property);

            // See if we have any sorts applied, in which case, we may be done
            var sorts = listMessages.Items.SortDescriptions;

            if (ifNoneAlready && sorts.Count > 0)
            {
                return;
            }

            // Look for a sort on the target columm
            var matches = sorts.Where(s => s.PropertyName == property);

            if (matches.Count() > 0)
            {
                // If there is one, just toggle it
                var sort = matches.First();
                direction = ((sort.Direction == ListSortDirection.Ascending) ?
                             ListSortDirection.Descending : ListSortDirection.Ascending);
                sorts.Remove(sort);
            }
            //else
            //{
            //    // If there is not one, see if we have the maximum number of sorts applied already
            //    // The algorithm works for any limit with no changes other than this test
            //    if (sorts.Count >= 2)
            //    {
            //        // If so, remove the oldest one
            //        var oldSort = sorts.Last();
            //        var oldCol = ((GridView)listMessages.View).Columns.Select(c => (GridViewColumnHeader)c.Header)
            //               .First(h => h.Tag.ToString() == oldSort.PropertyName);
            //        sorts.Remove(oldSort);

            //        // And the adorner that went with it
            //        var oldAdorners = AdornerLayer.GetAdornerLayer(oldCol);
            //        var oldAdorner = oldAdorners.GetAdorners(oldCol)?.Cast<SortAdorner>()?.FirstOrDefault(s => s != null);
            //        if (oldAdorner != null)
            //            oldAdorners.Remove(oldAdorner);
            //    }
            //}

            // Apply the requested sort as the dominant one, whatever it was before
            sorts.Insert(0, new SortDescription(property, direction));

            // Find any sort adorner applied to the target column
            var adorners = AdornerLayer.GetAdornerLayer(targetCol);
            var adorner  = adorners.GetAdorners(targetCol)?.Cast <SortAdorner>()?.FirstOrDefault(s => s != null);

            // If there is one, remove it
            if (adorner != null)
            {
                adorners.Remove(adorner);
            }

            // Create and apply the requested adorner
            adorner = new SortAdorner(targetCol, direction);
            adorners.Add(adorner);
        }