|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
Всем привет, понадобилось узнавать об измененных(с измененными свойствами) элементах в ObservableCollection, привязанная к DataGrid. Интерфейс INPC в модели строк DataGrid реализован, UpdateSourceTrigger=PropertyChanged везде проставлен. При редактировании DataGrid, сами модели редактируются, однако ObservableCollection не редактируется- в ней остаются состояние элементов на момент создания. MSDN пишет что CollectionChanged Event возникает, когда элемент добавлен, удален, изменен, перемещен или вся коллекция обновлена. https://msdn.microsoft.com/en-us/library/ms653375.aspx Почитав темы http://www.sql.ru/forum/992094/observablecollection-collectionchanged?hl=collectionchanged и подобные, пишут что событие CollectionChanged работает только на удаление, изменение. Пробовал реализовать предложенные решения по темам- действительно событие возникает только на удаление/изменение,и так и не нашел рабочего решения. Так вот вопрос MSDN обманывает об событии ObservableCollection(Of T).CollectionChanged и нужно самому реализовывать оповещение коллекции об изменении элемента с помощью делегатов и других радостей? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2017, 13:54 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
не надо путать палец с сами знаете чем есть INotifyPropertyChanged и этот интерфейс нужен для обновления binding'а при привязвке к свойстам есть INotifyCollectionChanged этот интефейс реализует вызов события при изменении в коллекции и Binding'ом он ни как не связан. А связан он с представлением коллекции ICollectionView, которая отслеживает изменения в коллекции источники и "передает" эти изменения в коллекцию представления. на сколько я помню все типа (Add, Insert, Remove, Move, Replace, Reset) события для ObservableCollection<T> поддерживаются нормально. При Insert, Remove, Move и Replace неоходимо обрабатывать индексы которые передаются в аргументах события. Так же важно учитывать, что ни какой групповой вставки\удаления не поддерживается, хотя в аргументах AddItems и RemoveItems это перечисления, в них не может быть более 1 элемента за 1 раз. При изменении коллекции ObservableCollection ни как не оповещает связывание об изменении, так как связывание отвечает только за передачу объекта коллекции, а не за его содержимое. Автор напишите, что вы хотите получить, нормально и получите соотвествующий совет. А рассказывать всем о том, как вас MS обманывает не надо :) вы сами себя не плохо обманывайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2017, 16:00 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
Roman Mejtes, ViewModel содержит ObservableCollection(Of T), которая забиндена к DataGrid. Пользователь редактирует значения в этом DataGrid, и когда он хочет выйти из активного View, я хочу получить все T, в которых были внесены изменения и отправить эти изменения в базу данных. Вот этого хочется. Понимаю, что можно это реализовать через делегаты или события , но интересно можно ли без них? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2017, 16:29 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
vb_sub, ну, Roman Mejtes вроде ж понятно объяснил, что "изменение коллекции" это не "изменение элемента(ов) этой коллекции"... а вот это "я хочу получить все T, в которых были внесены изменения и отправить эти изменения в базу данных" - непрофессиональная (для разработчика) "хотелка", которая на порядок усложняет/запутывает задачу... делайте проще/надежней - отправляйте в базу данных каждое изменение по каждому Т. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2017, 00:57 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
LRнепрофессиональная (для разработчика) "хотелка" 1. Хотелки обычно возникают не у разработчиков, а у заказчиков. 2. Что тут непрофессионального, не разъясните? LRкоторая на порядок усложняет/запутывает задачу... делайте проще/надежней - отправляйте в базу данных каждое изменение по каждому Т. Усложняет только для тех, для кого это сложно (некоторым и одно изменение по Т сохранить сложно, ага). vb_subи нужно самому реализовывать оповещение коллекции об изменении элемента с помощью делегатов и других радостей? А для вас, насколько я понимаю, это тоже сложно и трудно? Делегаты и типа всё такое? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2017, 06:22 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
Может просто надо использовать не ObservableCollection, а DataSet ? И не мучиться http://stackoverflow.com/questions/11608546/saving-dataset-to-database ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2017, 08:10 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
LR, LRделайте проще/надежней - отправляйте в базу данных каждое изменение по каждому Т - действительно рабочий и надежный вариант- просто я хотел его улучшить. Например если пользователь несколько раз будет редактировать одну и ту же запись, то не нужны посылать в БД промежуточные варианты редактируемой записи, а нужны только конечные- сокращаем в этом случае количество обращений к базе. Сон Веры Павловны А для вас, насколько я понимаю, это тоже сложно и трудно? Делегаты и типа всё такое? Нет не трудно, просто я хотел узнать есть ли штатные средства класса observablecollection для решения такой задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2017, 09:03 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
Siemargl, ADO.NET технология конечно не плохая, но она не очень удобна для WPF приложений. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2017, 09:09 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
Сон Веры Павловны1. Хотелки обычно возникают не у разработчиков, а у заказчиков. 2. Что тут непрофессионального, не разъясните? Ответ на вопрос п.2 уже содержится в утверждении п.1 ))) Сон Веры ПавловныУсложняет только для тех, для кого это сложно (некоторым и одно изменение по Т сохранить сложно, ага).Хм...странно слышать это от Вас... ну, на вскидку сравните ситуации "отправления изменений в базу данных" одной записи/экземпляра и множества - надо полагать, для Вас это одинаково несложно? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2017, 01:57 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
LRХм...странно слышать это от Вас... ну, на вскидку сравните ситуации "отправления изменений в базу данных" одной записи/экземпляра и множества - надо полагать, для Вас это одинаково несложно? Во-первых, если использовать ORM, то, по крайней мере, EF и NHibernate делают обновление в базе множества измененных записей вообще без каких-либо воркэраундов. Во-вторых, даже если использовать что-то самописное - да, одинаково несложно. Выгрузка измененных записей в UDTT либо сериализация в XML, и на сервере - один MERGE, и все. Будет чуть больше писанины руками, но ничего настолькр концептуально сложного, чтобы отказываться от такой операции, в этом нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2017, 06:08 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныВо-первых, если использовать ORM, то, по крайней мере, EF и NHibernate делают обновление в базе множества измененных записей вообще без каких-либо воркэраундов. Во-вторых, даже если использовать что-то самописное - да, одинаково несложно. Выгрузка измененных записей в UDTT либо сериализация в XML, и на сервере - один MERGE, и все. Будет чуть больше писанины руками, но ничего настолькр концептуально сложного, чтобы отказываться от такой операции, в этом нет. Серверная - менее проблемная сторона вопроса, но и здесь возникнут сложности ("один MERGE, и все" - одна запись из пачки нарушает какой-то констрейнт в БД, и...). Хотелось бы послушать о клиентской стороне, о концептуально несложном UI (что делать с валидацией данных, сносить всю на клиента или...? а если в многопользовательском режиме нужен контроль изменений? и т.п.). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2017, 12:09 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
LRчто делать с валидацией данных А она нужна? ТС об этом что-то писал? LRа если в многопользовательском режиме нужен контроль изменений? и т.п.). И об этом ТС вроде как не упоминал. Додумать за автора можно всё, что угодно, хоть контроль биржевых котировок в реальном времени, хоть прикручивание ко всему этому ИИ. И решение тогда будет монстром на год разработки и 1 млн. $. Но ровно в том объеме, в каком поставлена задача, она решаема на раз-два. Если автор не привел доп. условия - это его проблемы. Пускаться в далеко идущие фантазии на тему абстрактного ТЗ мне не представляется особенно конструктивным занятием. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2017, 15:42 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
В чем проблема в объекте VM (который представляет ваш объект данных) создать поле IsModified и изменять его в True, если свойства объекта изменились, в конструкторе по умолчанию можно это поле выставлять сразу в True, так как в DataGrid новый элемент создается из конструктора по умолчанию, либи инициализировать этое поле через соотвествующее событие DataGrid'а? ну это самый просто и топорный вариант, который делается минут за 10 без особого труда. потом можно получить список всех измененных или новых элементов и вставить либо через Merge или как душе угодно ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2017, 15:48 |
|
миф о CollectionChanged
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, а почему бы не додумать/дофантазировать за автора? Мне это занятие нравится, ведь это "обсуждение на форуме" а не "ТЗ от заказчика". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2017, 16:25 |
|
|
start [/forum/topic.php?fid=21&fpage=9&tid=1440553]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 182ms |
0 / 0 |