Где создать / получить / кэшировать ViewModels? - PullRequest
4 голосов
/ 20 ноября 2011

Прежде всего, я новичок в MVVM, поэтому, пожалуйста, помогите мне с этим:)

Предположим, у меня есть несколько представлений в моем приложении.В моем случае у меня есть представление редактора и представление браузера.Они оба должны работать с моделью представления "узла", который я редактирую.

Итак, где же фактически создается модель представления?

Предположим, что редактору предписано редактировать определенный узел- Это может создать новый «NodeViewModel» и работать с этим.Но в то же время существует NodeBrowserView, который позволяет людям быстро выбирать другой узел.По сути - мне нужен EditorView для работы с той же ViewModel, что и BrowserView, поэтому мне нужен универсальный метод «GetViewModelfor (X)».

Так как же это должно работать?:)

Приветствия:)

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

И ваш редактор вид, и браузер вид должны работать на каком-то NodeViewModel. Вы не должны нуждаться в отдельных моделях представления только для другого сценария представления.

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

Редактировать

По поводу вашего комментария. NodeViewModel должно быть предоставлено для представления редактора .

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

// this will probably be done in response to event
private void ListItemDoubleClick(object sender, EventArgs e)
{
    NodeViewModel currentItem = // extract current list item
    EditorView editorView = new EditorView(currentItem);
    editorView.Show();
}

В качестве альтернативы, если вы хотите избежать такой сильной связи между CompositeView и EditorView, вы всегда можете использовать события, однако это не всегда необходимо.

Еще одна вещь, о которой я думал в плане дизайна, это добавление дополнительной модели вида, назовите ее NodesListViewModel. Как может выглядеть поток программы:

  1. При запуске приложения получите ваши узлы (будь то БД, файл, служба, что угодно)
  2. Создать экземпляр NodeListViewModel, который принимает зависимость от IList<Node> (список сущностей узлов)
  3. NodeListViewModel создаст и выставит коллекцию NodeViewModel элементов
  4. Создайте экземпляр вашего основного окна программы, в котором используется составной вид. Ему нужен NodeListViewModel в качестве контекста данных.
  5. Всякий раз, когда пользователь решает, что ему нужно отредактировать элемент, все готово. Браузер имеет список всех NodeViewModels, он может легко подобрать текущий и передать его в выделенный вид.
0 голосов
/ 20 ноября 2011

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

...