Silverlight4 ObservableCollection и обновления в базе данных - PullRequest
0 голосов
/ 18 сентября 2010

Я реализовал функцию Drap n Drop, используя два списка (lstSource, lstDest), где пользователь может перетаскивать элементы между двумя списками. У меня есть две ObservalableCollections (sourceCollection & destCollection), которые связаны с соответствующими списками. В методе начальной загрузки DomainContext получает все задачи из базы данных и устанавливает для нее исходную коллекцию. Затем я использую LINQ (где t => t.UserID == thisUserID), чтобы получить подмножество задач из исходной коллекции и установить destCollection. Теперь пользователь может добавлять / удалять задачи из lstDest (destCollection).

У меня вопрос, как я могу сохранить эти изменения обратно в БД, когда пользователь нажимает кнопку Сохранить.

Я проверил DomainContext.HasChanges, который возвращает false, поэтому не может использовать context.SubmitChanges ()

Есть идеи, как сохранить эти изменения в БД с последним списком задач для пользователя?

Любой ответ будет оценен.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2010

Спасибо за подробный ответ, Алекс. На самом деле мне нужно сохранять списки отсортированными также в порядке, который хочет пользователь (перемещая элементы вверх / вниз), поэтому я использовал отдельные ObservableCollections. Всякий раз, когда пользователь добавляет / удаляет, изменяет положение элементов в списке, которые я зацикливаю через них, сбрасываю их индекс (приоритет), создаю новый временный список и присваиваю его объекту ObersvableCollection.

но я попробую то, что ты предложил, и дам тебе знать, как это происходит. Мои данные не слишком большие.

Еще раз спасибо за подробный ответ.

0 голосов
/ 19 сентября 2010

При перемещении элементов между коллекциями вам также необходимо установить некоторые их свойства, чтобы обозначить изменения. ObservableCollection предоставляет событие NotifyCollectionChanged, которое вы можете использовать для этой цели. Поэтому ответом было бы установить свойство User Задачи для текущего пользователя, когда Задача входит в ListBox, который обозначает задачи текущего пользователя, и удалять его, когда оно входит в коллекцию задач.

Edit: Другой метод, который я использовал, если коллекция обычно содержит умеренное количество элементов (какой предел я не знаю, вы должны тестировать с соответствующими тестовыми данными), состояла в том, чтобы все элементы в одной коллекции (обычно ObservableCollection были возможность динамически добавлять / удалять элементы, не беспокоясь об обновлении пользовательского интерфейса), и создавать два представления (интерфейс ICollectionView, обычно создаваемый с помощью CollectionViewSource в Silverlight, я думаю), каждое из которых имеет предикат фильтрации. Представление использует предикат, чтобы определить, принадлежит ли элемент представлению или нет; поэтому одно представление может иметь условие предиката «пользователь должен быть равен текущему пользователю», а другое - «пользователь должен быть нулевым».

Простая установка пользовательского свойства сущности в вашей коллекции (если сущность реализует INotifyPropertyChanged) автоматически приведет к перемещению сущности в соответствующем представлении. Конечно, для этого потребуется изменить часть проблемы путем перетаскивания: при перетаскивании элемента в список необходимо установить для его пользовательского свойства либо текущего пользователя, либо значение null в зависимости от цели перетаскивания, а затем все остальное берется. забота о взглядах.

Изменения все еще необходимо сохранить в базе данных - просто вызовите SubmitChanges (по крайней мере, это то, что он называется в службах RIA, я думаю ... работающий со слишком многими технологиями в данный момент), когда пользователь нажимает "ОК" или кнопка «Сохранить» или что-то еще. Измененные объекты будут сохранены, и они будут обнаружены как измененные, поскольку их пользовательское свойство было изменено.

...