Отмена обновления в WPF с привязкой - PullRequest
2 голосов
/ 11 ноября 2011

Это скорее концептуальный вопрос.Если это поможет, скажем, это попадает в шаблон MVVM.Я никогда не сталкивался с этим в своих исследованиях по связыванию WPF.

Если у вас есть окно, в котором есть элементы, связанные с моделью представления посредством привязки, и пользователь обновляет запись, но перед сохранением решает:отменить обновление, что бы вы назвали лучшим способом отмены изменений?

Я могу подумать о нескольких возможностях:

  1. Вместо того, чтобы позволять пользователю обновлятьНа главном экране появится всплывающее окно для редактирования второго окна, которое привязано к копии виртуальной машины и после «Сохранить» записывает эти данные в исходную виртуальную машину, а затем обновляет ее до модели. Увеличивает использование памяти и усложняет функцию Сохранить.
  2. Создайте «нетронутую» копию исходного объекта ВМ и после «Отмена» запишите эту ВМ поверх оригинала (при этомвремя копия может быть удалена). Увеличивает использование памяти и усложняет функцию Отмена.
  3. Создайте копию каждого из элементов в ВМ, которая может измениться при создании и после «Отмена», запишите эти значения поверхизменились. Увеличивает размер и сложность ВМ.
  4. После выполнения «Отмена» ВМ обращается к источнику данных и перезагружает запись. Вызывает сетевой трафик и трафик доступа к БД и, возможно, задержку времени для обновления дисплея до исходного состояния.Также может вызвать проблемы, если виртуальная машина была обновлена ​​из другого процесса, и эти «внешние» обновления не должны быть удалены.

Может кто-нибудь придумать лучшее решение этой проблемы или узнать о некоторыхнеясная функциональность в WPF, которая обрабатывает это «автоматически»?

Ответы [ 3 ]

3 голосов
/ 12 октября 2012

Я думаю, что самый простой способ сделать это - использовать BindingGroup, которая будет задерживать обновления виртуальной машины до тех пор, пока пользователь явно не внесет изменения.Таким образом, элементы управления будут кэшировать измененные значения, и BindingGroup сможет восстановить исходные значения с (все еще неизменной) виртуальной машины.

2 голосов
/ 11 ноября 2011

Я реализовал IEditableObject в моих ViewModels и делаю копию полей при входе в режим редактирования, вызывая EditCommand.

У меня также есть SaveCommands, которые можно вызывать при подтверждении редактирования.Или используйте команду CancelEdit, чтобы вернуться к скопированным значениям.

0 голосов
/ 11 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...