|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
DataGrid, как я понял, предназначен для работы с БД и работает транзакциями. Поэтому не очень подходит для редактирования небольших списочных свойств. В инете много разных способов приспособления DataGrid для этих целей, но все они какие-то "корявые". Поэтому и хотел поинтересоваться, более красивым логичным решением. Приведу пример и объясню, что мне в нём не нравится. Класс для элементов списка Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
Модель Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Модель представления Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
Окно Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
Code Behind Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Набор классов для работы с командами не прикладываю, он идентичен предоставленному Романом в http://www.sql.ru/forum/1304673/pravilnoe-razmeshhenie-funkcionala-i-privyazki-komand Теперь что мне не нравится. 1) Использование обработчиков событий для отслеживания изменений в DataGrid. Вызов методов VM из CB. 2) Отсутствие у DataGrid события извещения о немедленном изменений значений в ячейке. В данном пример, это приводит к тому, что кнопка не активна до тех пор пока не выйдешь из первой изменённой ячейки. Если изменяешь только одну и надо сразу сохранить изменения, то так не получится. Т.е. более удобным здесь было бы событие аналогичное TextBox.TextChanged 3) Добавление новой строки только после выхода из редактирования предыдущей новой. Это приводит к тому, что когда ввёл значение в новую строку и пытаешься его сохранить кликнув по кнопке - кнопка отпрыгивает и надо переводить курсор и заново кликать по кнопке. Вижу несколько вариантов решения: - Изменить класс FieldTwoProperty добавив в него события извещения изменения элементов, создания нового элемента и потом прослушивать их. - Создать кастомный вид коллекции для источника DataGrid - Вместо DataGrid создать свой UserControl Какие ещё могут быть варианты? Какое решение будет лучше соответствовать концепциям WPF, MVVM ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 13:19 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld Hasp1) Использование обработчиков событий для отслеживания изменений в DataGrid. Вызов методов VM из CB. 2) Отсутствие у DataGrid события извещения о немедленном изменений значений в ячейке.Честно говоря, в твой код не вчитывался. Я работал с DataGrid, где каждая строка привязана к VM строки, и мне не требовался CB, не очень понял, для чего он нужен. Что касается уведомления об изменении текстбокса - делаешь свой CellEditTemplate в виде того же текстбокса и делаешь привязку к модели с немедленным уведомлением свойства (а не по потере фокуса). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 13:28 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld Haspсоответствовать концепциям WPF, MVVM ?не нужно пихать концепцию в грид. Это слишком мелко. Вы просто доводите компонент штатный до своих хотелок, либо берете готовый https://docs.telerik.com/devtools/wpf/controls/radgridview/overview2 Компонент должен быть максимально изолирован от остального прикладного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 13:39 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspПоэтому не очень подходит для редактирования небольших списочных свойств.они тоже в бд как справочники. Поэтому модель обычно другая. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 13:43 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123не нужно пихать концепцию в грид.Как вариант. Я делал одну оболочку для него, это был именно юзерконтрол с СВ (из-за динамической загрузки столбцов, динамического назначения селекторов шаблонов) - но с точки зрения эксплуатации - да, концепция "черный ящик", а снаружи DP для встраивания в MVVM ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 13:46 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld Haspпредназначен для работы с БД и работает транзакциями. Да ну, ерунда. Никаких транзакций там нет, и DataGrid вообще не в курсе, откуда пришли данные, и как сохраняются. Eld HaspТеперь что мне не нравится. Что мне не нравится сразу же и навскидку: Equals и GetHashCode зависят от значений изменяемых полей. На этом моменте можно долго и весело ловить разные баги (и да, я их ловил). Вышеупомянутые методы в связке должны идентифицировать объект (и балансировать дерево) вне зависимости от жизненного цикла объекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 13:47 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныEqualsда. С бд этого вообще не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 13:49 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Shocker.ProPetro123не нужно пихать концепцию в грид.Как вариант. Я делал одну оболочку для него, это был именно юзерконтрол с СВ (из-за динамической загрузки столбцов, динамического назначения селекторов шаблонов) - но с точки зрения эксплуатации - да, концепция "черный ящик", а снаружи DP для встраивания в MVVMя помню. Но редко встречается, когда неизвестно сколько столбцов. У вас проект - динамика. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 13:50 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
В субд и ОРМ однозначно идентифицирует объект PK. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 13:52 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Shocker.ProEld Hasp1) Использование обработчиков событий для отслеживания изменений в DataGrid. Вызов методов VM из CB. 2) Отсутствие у DataGrid события извещения о немедленном изменений значений в ячейке.Честно говоря, в твой код не вчитывался. Я работал с DataGrid, где каждая строка привязана к VM строки, и мне не требовался CB, не очень понял, для чего он нужен. Что касается уведомления об изменении текстбокса - делаешь свой CellEditTemplate в виде того же текстбокса и делаешь привязку к модели с немедленным уведомлением свойства (а не по потере фокуса).С TextBox в ячейке DataGrid пробовал. Там получаются проблемы с редактированием TetxBox - нужно два клика. Первым кликом выделяется ячейка, а вторым входишь в редактировании TextBox. В новой строке, там по моему, вообще получалось три клика, и какие-то проблемы с добавлением в источник новой строки. Т.е. не получалось сравнить источник DG с источником в модели и определить, что изменения произошли.Сон Веры Павловны.... Да ну, ерунда. Никаких транзакций там нет, и DataGrid вообще не в курсе, откуда пришли данные, и как сохраняются. Я может не правильно выразился. Я имел ввиду, конкретно, вот такой нюанс. Новая строка в DataGrid существует только в нём. В источнике её нет. Поэтому по источнику не получится определить были изменения или нет. В идеале, мне нужно получить такое поведение. При любом изменении в новой строке DG она сразу должна добавиться в источник. И, соответственно, в DG появится снизу другая новая строка.Сон Веры ПавловныЧто мне не нравится сразу же и навскидку: Equals и GetHashCode зависят от значений изменяемых полей... В данном случае мне надо определить были ли внесены изменения в список, для этого мне надо сравнить список из DG и список в модели. Любое расхождение между списками: разное количество элементов, разная их последовательность, любое изменение в одном из свойств. Для последнего я и переопределил Equals. Если такой подход не верен, то как лучше сделать?Petro123не нужно пихать концепцию в грид. Это слишком мелко. Вы просто доводите компонент штатный до своих хотелок, либо берете готовый https://docs.telerik.com/devtools/wpf/controls/radgridview/overview2 Компонент должен быть максимально изолирован от остального прикладного кода.Под одной из концепцией я и имел ввиду "Компонент должен быть максимально изолирован от остального прикладного кода". Это одна из причин почему мне не нравится решение в моём примере. radgridview - посмотрю, что за зверь. А как довести "компонент штатный до своих хотелок" - не знаю. То ли "хотелок" больше чем возможности штатного элемента, то ли мои возможности и умения значительно ниже моих "хотелок" ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:28 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld Hasp, Есть грид эксель, и есть грид для субд. Тебе какой? ЗЫ в дельфи это 2 разных грида. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:32 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld Haspразная их последовательность,??? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:35 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspТо ли "хотелок" больше чем возможности штатного элементаДа. DataGrid вообще довольно слабый. Но хорошие гриды стоят денег, а бесплатные - г. Так что либо платить деньги, либо пилить свой, с маджонгом и гейшами ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:35 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld Hasp, Есть грид эксель, и есть грид для субд. Тебе какой? ЗЫ в дельфи это 2 разных грида.DataDrid из C# + WPF + VS2017 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:43 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld Haspто ли мои возможности Третья причина в том что ты с базами на вы. А надо на ты. Без них сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:44 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld Haspразная их последовательность,???Допустим, в DG поменяли местами первую и вторую строку. То есть элементы те же, но их последовательность другая. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:45 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspDataDrid из C# + WPF + VS2017я говорил о запросах. Какой нужен?. Т.к. очередность в коллекции это странно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:46 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspДопустим, в DG поменяли местами первую и вторую строку. То есть элементы те же, но их последовательность другая.жмакнули на сортировку? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:47 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld Haspто ли мои возможности Третья причина в том что ты с базами на вы. А надо на ты. Без них сложно.В данном случае в решении, вообще, нет БД. Небольшое приложение - данные из XML файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:47 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld Haspданные из XML файла.а там имеет значение очередность? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:49 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld HaspДопустим, в DG поменяли местами первую и вторую строку. То есть элементы те же, но их последовательность другая.жмакнули на сортировку?Ну в том числе. Или пользователю, захотелось какую-то строку переместить для своего удобства. Так как данные в XML, то при любом изменении всё равно надо сохранять весь файл. Поэтому я просто определяю есть изменения или нет. Если есть, то всю инфу пересохраняю. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:50 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld Haspданные из XML файла.а там имеет значение очередность?Только удобство для пользователя. Так как таких строк может или вообще не быть, или быть много. Они могут не помещаться все на видимом поле. И пользователь может передвинуть их вверх вниз в зависимости от того, что ему нужно видеть в первую очередь. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:53 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld Hasp, Мрак. Короче, ты жить богато и с зарплатой хочешь? Тогда дальнейшее твое творчество уже наносит вред развитию программиста. Выкинь xml и этот топик будет не нужен. Удачи! Имхо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:53 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Shocker.ProEld HaspТо ли "хотелок" больше чем возможности штатного элементаДа. DataGrid вообще довольно слабый. Но хорошие гриды стоят денег, а бесплатные - г. Так что либо платить деньги, либо пилить свой, с маджонгом и гейшами Пойду - пилить.... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:55 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspОни могут не помещаться все на видимом поле. И пользователь может передвинуть их вверх вниз в зависимости от того, что ему нужно видеть в первую очередь.а) скроллинг б) доп. Колонка и свойство Очередность. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:56 |
|
|
start [/forum/topic.php?fid=21&msg=39728556&tid=1440380]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 261ms |
0 / 0 |