И ваш редактор вид, и браузер вид должны работать на каком-то 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
. Как может выглядеть поток программы:
- При запуске приложения получите ваши узлы (будь то БД, файл, служба, что угодно)
- Создать экземпляр
NodeListViewModel
, который принимает зависимость от IList<Node>
(список сущностей узлов)
NodeListViewModel
создаст и выставит коллекцию NodeViewModel
элементов
- Создайте экземпляр вашего основного окна программы, в котором используется составной вид. Ему нужен
NodeListViewModel
в качестве контекста данных.
- Всякий раз, когда пользователь решает, что ему нужно отредактировать элемент, все готово. Браузер имеет список всех
NodeViewModels
, он может легко подобрать текущий и передать его в выделенный вид.