Я пытаюсь сохранить одну строку в DataGrid всегда сверху, сохраняя возможность сортировать все остальные строки по столбцам (int и строковые столбцы).Исправить первую строку в DataGrid
Структура моих данных дает небольшую помощь: первый столбец имеет имя «Id», а строка, которую я пытаюсь сохранить сверху, имеет самый низкий идентификатор всех идентификаторов. Эта строка содержит агрегированные значения.
Типичный DataGrid может выглядеть следующим образом:
ID | Name | Result1 | Result2
5 | avg | 2 | 5
6 | opt1 | 1 | 3
7 | opt2 | 3 | 7
Там может быть п столбцов и число столбцов изменяется во время выполнения. DataGrid привязан к ListCollectionView, и я также реализован пользовательский сортировщик на основе trilson86's answer:
<DataGrid result:CustomSortBehaviour.AllowCustomSort="True"
IsReadOnly="True"
ItemsSource="{Binding ResultDataView}">
</DataGrid>
До сих пор, используя soution trilson86, я сумел сохранить первую строчку сверху при сортировке. Это обработчик в моей CustomSortBehavior-класса, который готовит полезные куски данных (например, минимальный-Id в текущем DataGrid) для пользовательского сортировщика:
private static void HandleCustomSorting(object sender, DataGridSortingEventArgs e)
{
var dataGrid = sender as DataGrid;
if (dataGrid == null || !GetAllowCustomSort(dataGrid)) return;
var listColView = dataGrid.ItemsSource as ListCollectionView;
var min = listColView.Cast<DataRowView>().Min(x => x.Row[0]);
var sorter = new MyComparer();
e.Handled = true;
var direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending;
e.Column.SortDirection = sorter.SortDirection = direction;
sorter.IdOfFirstRow = Convert.ToInt32(min);
listColView.CustomSort = sorter;
}
Обычай сам сортировщик:
public int Compare(object x, object y)
{
var rowView1 = x as DataRowView;
var rowView2 = y as DataRowView;
var row1 = rowView1.Row;
var row2 = rowView2.Row;
var row1Id = Convert.ToInt32(row1[0]);
var row2Id = Convert.ToInt32(row2[0]);
if (row1IdValue == IdOfFirstRow)
return -1;
if (row2IdValue == IdOfFirstRow)
return 1;
if (SortDirection == ListSortDirection.Ascending) {
return row2Id.CompareTo(row1Id);
}
else
{
return row1Id.CompareTo(row2Id);
}
}
Это только половина решения .. hardcoded as is, я могу сортировать только по идентификатору. Поскольку столбцы будут добавлены во время выполнения, во время разработки я не могу определить все столбцы и присоединить сортировщик в соответствии со значением типа столбцов (int или string).
Как я могу сортировать все остальные столбцы, сохраняя ограничение на то, что строка с минимальным идентификатором остается сверху?
Зачем вам нужен первый ряд, закрепленный наверху? Я предполагаю, что это * не * показывает информацию заголовка, но я не могу себе представить, какие * данные * должны были бы оставаться на вершине. –
У меня есть datatable, где первая строка под заголовками отображает агрегированную информацию, а все остальные строки - нет. Таким образом, при сортировке требование состоит в том, что первая строка, содержащая агрегированную информацию, должна оставаться прямо под заголовками. – peter
Я бы не сохранил агрегированную информацию в самой таблице, а в отдельной модели представления (в случае необходимости модель могла бы быть в ExtendedProperties таблицы). Затем создайте настраиваемый шаблон для DataGrid, в котором вы добавляете агрегированную информацию между заголовком и фактическими строками. –