2010-01-22 2 views
3

В пользовательских интерфейсах часто требуется реализовать кнопку отмены при редактировании некоторых объектов. В WPF было бы неплохо, если бы вы могли сделать вашу модель обзора транзакционной. Я попытаюсь объяснить немного более подробно, что я имею в виду:Транзакционные объекты в .NET

Модель просмотра подключена к модели и предоставляет данные таким образом, чтобы их было легче обрабатывать (используя привязку данных). Изменения в модели представления приводят к изменениям в модели. Однако, если есть кнопка отмены, вы обычно не хотите немедленно выполнять изменения на модели, поэтому я думаю о каких-то изменениях буферизации. Когда вы фиксируете изменения, их переносят в модель, иначе они удаляются.

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

Я ищу рамки, которые делают такие вещи. Есть ли там там?

С наилучшими пожеланиями,
Оливер Hanappi

ответ

1

BindingGroups не только для проверки привязки, вы можете использовать BeginEdit, CommitEdit и CancelEdit BindingGroup для включения транзакционной логики. Если вы являетесь чистым MVVM-типом, есть одна вещь, которая может быть проблемой для вас - вы, скорее всего, получите какой-то код в своих взглядах, иначе это будет работать как шарм.

+0

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

2

Вы посмотрите на Cinch MVVM Framework Сашей Barber может.

Он предлагает «использование IEditableObject для сохранения/восстановления состояния объекта на редактирование/отмена редактирования»

1

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

Другие варианты включают в себя реализацию IEditableObject, для отката изменений: http://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject.aspx Это не всегда приятно, когда вы пытаетесь сделать глубокие копии нетривиальных объектов.

Я думаю, что ваше решение в порядке, но мне любопытно, почему все становится плохо с коллекциями.