WPF DataGrid - отключить сортировку и фильтрацию при редактировании строк? - PullRequest
3 голосов
/ 08 марта 2011

Кто-нибудь пытался реализовать следующий сценарий?Мне было бы интересно узнать, какие решения существуют для достижения этой цели.Это стало настоящей болью для наших пользователей ...

У нас есть WPF DataGrid, который дает пользователю возможность фильтровать свои строки данных на основе столбца (где Column = Value или начинается с, заканчивается с, содержити тд и тп).Они также могут сортировать данные, щелкая один из заголовков столбцов, или мы также предоставляем им окно сортировки, где они могут добавлять несколько столбцов и выбирать по возрастанию / убыванию для каждого столбца (который просто применяется к свойству «SortDirection» в каждом столбце).они выбирают, кажется, что он также использует «CollectionView» вместе с SortDescription).

Проблема заключается в том, что пользователь редактирует данные и применяет «фильтр» или «сортировку» (или оба), еслиПользователь редактирует значение в одном из этих отфильтрованных / отсортированных столбцов, строка «переместится» и возьмет с собой курсор.Если новое значение является значением, которое «фильтруется», то строка полностью исчезает (как и должно быть из-за примененной пользователем «фильтрации»).

Они хотели бы одну из двух вещейпроизойдет вместо этого:

1 - продолжить и автоматически сортировать и фильтровать после изменения каждой ячейки; если строка «перемещается», переместите курсор на следующую строку (ту же ячейку) вместо курсора, следующего за строкойк его новому желанию (и, возможно, прокручивая текущие видимые строки данных за пределы экрана).

2 - Как только строка будет отредактирована, отключите всю сортировку и фильтрацию, пока пользователь не нажмет «Сохранить» или «Обновить» (или какой-либо другой параметр)?

Я также могу видеть, гдемы могли бы использовать один подход для фильтрации, а другой - для сортировки.

У кого-нибудь есть идея получше или есть идеи о том, как это реализовать?

У меня есть пара идей (Например,чтобы отключить сортировку: в моем обработчике событий CellEditEnding я мог сохранять параметры сортировки пользователей, очищать их от каждого столбца и затем повторно применять их, когда пользователь нажимает кнопку «Сохранить / Сбросить», или, возможно, я смог обработать событие «Сортировка» и установить «e».обрабатывается "истина, когда данные редактируются ??).Я просто новичок в WPF и DataGrid, мне интересно, может быть, есть "лучшая практика" или свойство, которое я просто не нашел, например, "DisableSorting = true / false" (смеется).

Мысли?Мнения?

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

У меня была такая же проблема, и я, кажется, нашел решение.Все просто - просто добавьте еще одно SortDescription в качестве вторичного критерия сортировки.

0 голосов
/ 11 марта 2011

Я решил попытаться решить эту проблему под другим углом зрения, основываясь на публикации сотрудника Microsoft.Вот что я попробовал ... Похоже, что мой единственный оставшийся вариант - создать свою собственную DataGrid и переопределить соответствующие методы.

Я решил добавить кнопку, которая будет "блокировать" DataGrid.В этот момент я отключил бы всю сортировку, фильтрацию, удаление столбцов и т. Д. Затем я скопировал бы DataTable и изменил DataGrid.DataContext на мою новую таблицу, когда они закончили редактирование, они бы «разблокировали» DataGrid, вВ этот момент я бы сделал DataTable.Merge () и перепривязал бы его обратно к Master / Source.Все их изменения будут в «главной» DataTable, и они смогут редактировать строки и столбцы, не пропуская (сортируя) строки по ним или не исчезая (не фильтруя).

Затем я понял несколько вещей.Во-первых, мне нужно будет использовать DataTable.DefaultView и получить «отфильтрованное» представление главной / исходной DataTable и назначить его в DataTableCopy (чтобы отфильтрованные строки не появлялись в DataTable, который они собираются редактировать).Это не должно быть проблемой, я не думаю .. Тогда я понял кое-что, что будет проблемой.Как только они фильтруют данные и сортируют их так, как хотят, я копирую их и перепривязываю DataGrid к скопированной таблице (которая не будет содержать скрытых или отфильтрованных строк), данные больше не будут сортироваться должным образом.Правильно???Как я могу сделать так, чтобы он был отсортирован правильно, НО не прибегать к DataGrid, так как они редактируют строки и столбцы?

Как видите, я в основном прошел полный круг к исходной задаче!Если бы я мог просто как-то «отключить» фильтрацию и сортировку, но сохранить данные упорядоченными и отфильтрованными!

У меня не так много опыта с этим, но я не могу (в теории) использовать дизассемблер (Reflector? Пока он еще бесплатен .. LOL ...) и создать свой собственный класс DataGrid?Мне ТОЛЬКО нужно переопределить любой метод, используемый для фильтрации / сортировки.Правильно?Я немного просмотрел класс DataGrid, но даже не могу понять, какие методы «переопределить».Я думаю, что есть способ настроить Reflector, чтобы вы могли приступить к (отладке) разобранного кода.Похоже, это мой единственный вариант.

Любые другие предложения ??

ОБНОВЛЕНИЕ: Мое предположение было неверным!Похоже, что если я использую DataTable.DefaultView.ToTable (), он не только «сохраняет» фильтрацию, но и сохраняет «порядок сортировки».Похоже, это решение будет работать в конце концов!

...