Действительно ли 1 ViewModel имеет 1 View? - PullRequest
1 голос
/ 16 февраля 2010

сказано, что 1 ViewModel имеет 1 View.

1 Просмотр для меня UserControl. Что, если в моем UserControl есть разные области, заполненные данными из разных сущностей, у меня есть несколько видов и мне нужно создать несколько моделей представления?

Например: я отображаю в UserControl 3 объекта: клиент (список), заказ (сетка данных), продукт (сетка данных). Каждая из этих «областей данных» имеет кнопки добавления и удаления и текстовые поля для ввода данных.

На самом деле каждая из этих «областей данных» помещается в свою собственную GRID, имеющую возможность задавать отдельный текст данных.

1.) Должен ли я сейчас создать 3 ViewModels CustomerVM, OrderVM и ProductVM? 2.) Считаются ли эти 3 «области данных» отдельным видом View, хотя я не поместил их в 3 файла UserControls.xaml ??? 3.) Когда этот пользовательский элемент управления находится внутри вкладки TabControl, где я могу загрузить данные, связанные с 3 объектами? Внутри MainViewModel? Я хочу показывать / загружать эти данные только тогда, когда пользователь щелкает вкладку.

1 Ответ

4 голосов
/ 16 февраля 2010

Нет, вы можете сделать все это в одной модели. Задача модели представления заключается в том, чтобы хранить данные для представления и при необходимости преобразовывать эти данные, чтобы представление могло их использовать. Ничто не говорит о том, что модель представления должна содержать определенные типы информации, то есть не существует правил, в которых говорится, что «она может содержать только информацию о клиенте, а не информацию о заказе».

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

Редактировать: позвольте мне объяснить этот последний абзац немного подробнее.

Example 1: i have a new V which shows customer information, and i have an existing VM which has customer info AND order info

Я бы неохотно использовал эту ВМ для этого V, потому что, несмотря на то, что у него есть информация о клиенте, которая мне нужна, у него слишком много информации - я использую ВМ вне контекста, для которого он изначально предназначен.

Example 2: i have a VM that contains full client info, like their postal and residential address, their phone numbers, their girlfriend's names*, and a bunch of other client type info. I have a V which shows the client's name, birthday, and maybe two other properties.

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

At what point would i stop using the current ClientViewModel, and write a new one that was more specific to the needs of the modified ClientView?

На этот вопрос нет однозначного ответа - это зависит от количества времени, которое у меня есть для выполнения изменений, количества времени, доступного для тестирования, и компромисса в сложности между использованием полноценного объекта Client для виртуальной машины и написание новой более простой версии объекта Client, при этом сохраняя старую версию.

*, это должна быть коллекция независимых объектов, включенных в объект client, но просто поработайте со мной, это выдуманный пример:)

...