Как правильно MVVM справиться с «вставкой» - PullRequest
4 голосов
/ 13 февраля 2012

Вот мое требование (ради этого вопроса я упрощаю вещи). У меня есть список людей, идентифицированных по имени и фамилии. Список хранится в файле XML. Мне нужно построить приложение WPF, которое состоит из двух окон: в главном окне отображается список. Ничего особенного, просто список с именем и фамилией. Три кнопки внизу: Добавить, Изменить, Удалить. При нажатии кнопки «Удалить» выбранная строка навсегда удаляется из файла. При нажатии кнопки «Добавить» или «Изменить» появляется второе окно (диалоговое окно), в котором вы можете соответственно ввести нового человека, введя его имя и фамилию, или изменить и сохранить существующую запись.

Как правильно построить это приложение в MVVM? Вот конкретные вопросы, которые у меня есть:

1) С точки зрения MVVM я не могу связываться напрямую с источником данных XML, или я могу? Поэтому я должен создать объект Person, который реализует INotifyPropertyChange, а затем сохранить группу этих объектов в ObservableCollection. Соответственно, мне нужно написать код, который читает XML-файл и преобразует его в набор объектов, и наоборот, когда мне нужно сохранить изменения обратно в файл. Я прав?

2) Куда поместить реализацию метода «Persist», которая фактически сохраняется в файл XML? Есть два места, где этот метод будет вызываться: нажать кнопку «Удалить» в главном окне или кнопку «ОК» в окне «Добавить / изменить».

3) Обратите внимание, что одно и то же окно обрабатывает Add и Edit, как мне правильно реализовать это окно MVVM? Как мне отобразить заголовок этого окна «Добавить» или «Редактировать» соответственно, не прибегая к уродливым операторам, если я код позади? К чему я привязываю два текстовых поля, которые у меня есть (имя и фамилия). Также обратите внимание, что в окне «Добавить / редактировать» есть кнопки «ОК» и «Отмена», изменения не будут приняты до тех пор, пока не будет нажата кнопка «ОК», и если нажать кнопку «Отмена», изменения должны быть отменены. Одним из возможных решений, которое я вижу, является клонирование объекта Person, а не связывание непосредственно с тем же объектом, с которым связан список, так что в списке не отображаются изменения, пока не будет нажата кнопка ОК, но это сложно, поскольку мне нужно написать код для копирования свойств туда и обратно , Есть ли лучший способ сделать это в MVVM?
Заранее благодарен

Генри

1 Ответ

2 голосов
/ 13 февраля 2012

Чтобы ответить на три ваших конкретных вопроса,

1 / Если ваш View напрямую связан с XML, то это не MVVM. Шаблон MVVM привязал бы ваш View к ViewModel, который представляет XML. Если вам не нужно изменять XML, тогда нет проблем с прямым связыванием, но поскольку вы собираетесь добавлять / редактировать / удалять значения из XML, имеет смысл иметь ViewModel, управляющий этим взаимодействием. Я бы действительно создал Person объект, который реализует INotifyPropertyChanged.

2 / В MVVM весь функциональный код отправляется во ViewModel. Эта кнопка Persist запускает команду, которая вызывает метод во ViewModel. Сначала это несколько запутывает, и не так просто, как «щелчок» выделенного кода, но имеет больше смысла с тупой точки зрения View / MVVM. Это также чище.

3 / Экран «Редактировать» привязывается к объекту Person и запускает команду Save. Эта команда должна затем выполнить соответствующую логику, определяя, является ли она новой (вставить) или существующей (обновить) записью. Если объект новый, то родительский ViewModel (вам понадобится ViewModel для коллекции, а не просто ObservableCollection) должен перехватить это событие и добавить новый объект в коллекцию.

Кроме того, окно «Редактировать / Добавить» может возвращать результат, и родительский ViewModel может исследовать этот результат после закрытия окна, а затем определить, что делать (сохранить / удалить, редактировать / добавить, любую другую проверку и т. Д.) .

Вот несколько ссылок:

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