Как реализовать основные детали CRUD на одном экране под MVVM - PullRequest
6 голосов
/ 12 февраля 2010

У меня есть приложение MVVM (Prism), для которого мне нужно реализовать экран сведений о мастере, когда мастер представляет собой просмотр списка, а рядом с ним отображаются подробности. Только для чтения кажется достаточно легким (еще не сделал этого, но я разбираюсь в связывании WPF), но меня смущает редактирование / добавление.

Как мне сделать так, чтобы мастер не обновлялся до тех пор, пока детали не будут сохранены? Как сделать так, чтобы вы не могли изменить текущий выбор мастера в режиме редактирования / добавления?

Я много гуглил, но не нашел никаких мясных примеров этого.

Спасибо.

PS: этот вид является дочерним видом на большом экране. Вот почему я хочу и мастер, и детали вместе.

Ответы [ 2 ]

1 голос
/ 12 февраля 2010

Вы, конечно, можете сделать это, хотя, по моему мнению, такой дизайн пользовательского интерфейса не в состоянии использовать всю мощь WPF. Старые пользовательские интерфейсы WinForms обычно не обновляли большую часть приложения до тех пор, пока данные не были сохранены на SQL Server (или где-либо еще), потому что у них не было реальных бизнес-объектов и мощной системы привязки, такой как WPF. Попытка скопировать ограничения WinForms в WPF кажется мне шагом назад. Почему бы не показывать последние данные везде, где они видны в пользовательском интерфейсе, в том числе в главном представлении? Кроме того, почему бы не разрешить пользователю редактировать несколько элементов перед сохранением, например пометить любой отредактированный, но несохраненный элемент анимированным маркером на главном экране? Объедините их с обобщенной отменой, и вы получите лучший дизайн и более интуитивно понятный для пользователя.

Однако, если ваши бизнес-требования делают это абсолютно необходимым, вот как это сделать:

Предотвращение изменения данных, чтобы они не отображались за пределами детали, пока они не будут сохранены

После входа в ваш «режим редактирования / добавления» сделайте копию объектов данных и установите для DataContext вашего подробного представления копию вместо живого объекта. Когда данные «сохранены», скопируйте данные из теневой копии обратно в живой объект и установите DataContext вашего подробного представления обратно туда, где он должен быть.

Предотвращение изменения текущего выбора мастера в режиме редактирования / добавления

Две возможности:

  1. В режиме редактирования / добавления измените главный вид, чтобы запретить тестирование нажатия мыши или фокус клавиатуры

  2. Когда начинается режим редактирования / добавления, запишите «текущий выбор», затем добавьте обработчик событий, который следит за изменениями «текущего выбора» и немедленно изменяет выбор обратно на то, чем он был. Когда режим редактирования / добавления завершится, удалите обработчик. Этот обработчик может быть удобно закодирован с использованием лямбда-выражения и с помощью замыкания на локальную переменную для хранения текущего выбора.

0 голосов
/ 15 февраля 2010

Спасибо за ответ. Теперь я перечитал свое сообщение и вижу, что оно довольно расплывчато. У меня есть экран, который редактирует объект, который содержит несколько списков других дочерних объектов. Я реализовал их как разные вкладки в элементе управления вкладками. Одна из этих вкладок редактирует комментарии, поэтому я хотел отобразить список комментариев с панелью редактирования для текущего выбора рядом со списком. Затем пользователь может использовать кнопки добавления, редактирования или удаления для обновления списка. Я хотел сделать это в чистом виде (изго) MVVM.

Я придумал следующий дизайн, который, кажется, работает с минимальными взломами.

Представление включает в себя список дочерних объектов просто в виде ListView, привязанного к наблюдаемой коллекции в ViewModel. Я включил буфер дочерних объектов - он используется для буферизации изменений до тех пор, пока они не будут готовы быть сохранены обратно в список (или выброшены).

Вид также включает панель редактирования, привязанную к объекту буфера в ViewModel. Буфер обновляется всякий раз, когда текущий выбор списка изменяется с использованием глубокой копии. Я попытался использовать привязку данных к свойству Selecteditem, но набор так и не был вызван, поэтому был добавлен небольшой метод с выделением кода для принудительного обновления свойства при изменении выбора.

Вид списка и вид редактирования являются взаимоисключающими. Теоретически вы можете скрыть отключенный, возможно, с помощью перевернутого экрана. Как правило, для моего приложения лучше, чтобы оба приложения отображались одновременно, поскольку на панели редактирования может отображаться дополнительная информация, не отображаемая в виде списка. Выбор того, какая панель включена, определяется привязкой IsEnabled к свойству ViewModel, например IsEditCommentMode.

Необходимо добавить команды для управления списком, это New, Edit и Delete. Обратите внимание, что Add и Edit установят буфер, а затем установят IsEditCommentMode в true. Эти команды управления списком доступны, только если IsEditCommentMode имеет значение false. Панель редактирования реализует команды «Сохранить» и «Отмена», они включаются только в том случае, если IsEditCommentMode имеет значение true. Когда Save выполняется, он должен скопировать из буфера в список (добавить или обновить) и запустить уведомление об изменении. Наконец, он должен установить для IsEditCommentMode значение false.

Это все работает хорошо и, похоже, не нарушает никаких требований MVVM (по моему скромному, но часто ошибочному мнению).

...