MVVM и иерархия View / ViewModel
Я работаю над созданием моей первой игры с использованием C # и XAML для Windows 8. Я все еще изучаю основные концепции и лучшие практики, и MVVM стал препятствием. Я попытаюсь задать вопрос в двух частях.
Background
Игра, которую я делаю, - Судоку. У Судоку есть доска с 9x9 сеткой плиток. У меня три модели -Game
, Board
, а такжеTile
, КогдаGame
создается, он автоматически создаетBoard
и когдаBoard
создан, он создает 81 (9x9)Tiles
.
1. With a hierarchy of views, how are corresponding view models created?
Чтобы соответствовать иерархии моделей, я хотел бы иметь иерархию представлений (GameView
содержитBoardView
который содержит 81TileViews
). В XAML довольно легко создать эту иерархию представлений с помощью пользовательских элементов управления, но я не понимаю, как создаются модели представлений.
В приведенных мною примерах контекст данных пользовательского элемента управления часто задается моделью представления (с использованиемViewModelLocator
в качестве источника), который создает свежий экземпляр модели представления. Кажется, это хорошо работает, если у вас плоский вид, но также кажется, что это становится грязным, когда у вас есть иерархия. ЛиGameView
создатьGameViewModel
и оставь это на усмотрениеBoardView
ребенок, чтобы создатьBoardViewModel
? Если да, то какGameViewModel
общаться сBoardViewModel
? Может лиBoardViewModel
общаться обратно вверх по иерархии кGameViewModel
?
2. How does a view model get model data?
В iOS я бы начал с использования службы для полученияGame
модель, которая была предварительно заполнена данными. Я бы тогда создалGameViewController
контроллер представления (который отвечал за создание представления) и передатьGame
к этому. В MVVM я вижу ценность того, чтобы представление отвечало за создание своей собственной модели представления (в идеале с использованиемViewModelLocator
), но я не понимаю, как модель представления получает модель.
Во всех примерах, которые я обнаружил в сети, модель представления использует некоторый сервис для извлечения своих собственных данных. Но я не встречал ни одного примера, который бы принимал параметры конструктора или параметры, передаваемые с более высокого уровня навигации. Как это сделать?
Я не хочу использовать для своей модели ресурс приложения или какой-либо другой тип одноэлементного хранилища, потому что я этого не делаю, а что, если я хочу отображать на экране несколько головоломок одновременно? каждыйGameView
должен содержать свой собственныйGame
.
Мало того, чтоGameViewModel
нужна ссылка наGame
модель, ноBoardViewModel
который был каким-то образом создан (см. вопрос 1), нуждается в ссылке наBoard
модель, которая принадлежитGame
модель. То же самое касается всехTiles
, Как вся эта информация передается по цепочке? Могу ли я сделать эту тяжелую работу полностью внутри XAML, или мне придется выполнить какое-то связывание или другую инициализацию в коде?
Phew!
Я ценю любой совет, который вы можете дать, даже если он не является полным ответом. Я также заинтересован в том, чтобы найти примеры проектов MVVM, в которых есть проблемы, схожие с моими. Благодаря тонну!