Транзакционные объекты в .NET - PullRequest
3 голосов
/ 22 января 2010

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

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

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

Я ищу фреймворк для такого рода вещей. Там что-нибудь есть?

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

Ответы [ 3 ]

2 голосов
/ 22 января 2010

Вы можете взглянуть на Cinch MVVM Framework от Sacha Barber.

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

1 голос
/ 22 января 2010

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

1 голос
/ 22 января 2010

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

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

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

...