private void Sort_Click(object sender, RoutedEventArgs e) { if (this.sortMembers != null && this.list.SelectedItems.Count > 0) { List <CodeMember> selectedMembers = this.list.SelectedItems.Cast <CodeMember>().ToList(); Dictionary <CodeMember, int> selectedIndexes = selectedMembers .ToDictionary(member => member, member => this.observableMembers.IndexOf(member)); foreach (var typeGroup in selectedMembers.GroupBy(member => member.TypeElement)) { List <CodeMember> typeMembers = typeGroup.ToList(); this.sortMembers(typeMembers); // Get the selected indexes for the current type members in index order (i.e., from top to bottom in the list). List <int> sortedIndexes = typeMembers.Select(member => selectedIndexes[member]).OrderBy(index => index).ToList(); int itemCount = sortedIndexes.Count; // First, we have to take all the items out of the list. The ListView's data binding // logic gets really confused if we ever have the same item in the list multiple times, // and it can't restore SelectedItems properly after that. By nulling all the items // out first, we can replace the items in sorted order, and data binding stays happy. foreach (int index in sortedIndexes) { this.observableMembers[index] = null; } // Put the sorted members back in the type's selected ListView rows (but in sorted order). for (int i = 0; i < itemCount; i++) { CodeMember member = typeMembers[i]; int index = sortedIndexes[i]; this.observableMembers[index] = member; } } // Restore the list's selected items now that they're replaced in sorted order. // Note: this.list.SelectedItems should be empty now because we temporarily // nulled out all the selected items above. foreach (var pair in selectedIndexes) { this.list.SelectedItems.Add(pair.Key); } } }
private static bool IsOrderedByGroupingProperty(List <CodeMember> members, Tuple <MemberProperty, bool> groupingProperty) { bool result = true; CodeMember previousMember = null; foreach (CodeMember member in members) { if (previousMember != null && previousMember.CompareByMemberProperty(member, groupingProperty) > 0) { result = false; break; } previousMember = member; } return(result); }