Я работаю над созданием своей первой игры с использованием C# и XAML для Windows 8. Я все еще изучаю основные концепции и лучшие практики, а MVVM - это препятствие. Я попытаюсь задать вопрос в двух частях.MVVM и иерархия View/ViewModel
фон
Игра Делаю это Sudoku. Судоку имеет доску, которая содержит сетку из 9x9 плиток. У меня три модели: Game
, Board
и Tile
. Когда создается Game
, он автоматически создает Board
, а когда создается Board
, он создает 81 (9x9) .
1. С иерархией представлений, как создаются соответствующие модели представлений?
Чтобы соответствовать иерархии моделей, я хотел бы иметь иерархию взглядов (GameView
содержит BoardView
, который содержит 81 TileViews
). В XAML довольно легко создать эту иерархию представлений с помощью пользовательских элементов управления, но я не понимаю, как создаются модели представлений.
В примерах, которые я видел, контекст данных пользовательского элемента управления часто устанавливается на модель представления (с использованием ViewModelLocator
в качестве источника), который создает новый экземпляр модели представления. Кажется, это хорошо работает, если у вас есть плоский вид, но также кажется, что он становится беспорядочным, когда у вас есть иерархия. Создает ли GameView
и оставьте его до своего ребенка BoardView
, чтобы создать BoardViewModel
? Если да, то как связывается с BoardViewModel
? Может ли BoardViewModel
восстановить иерархию до ?
2. Как модель представления получает данные модели?
В iOS я бы начал с использования службы для извлечения модели Game
, которая была предварительно заполнена данными. Затем я создавал бы контроллер вида GameViewController
(который отвечал за создание представления) и передал ему Game
. В MVVM я вижу, что значение имеет представление о создании собственной модели представления (в идеале с использованием ViewModelLocator
), но я не понимаю, как эта модель представления получает модель.
Во всех примерах, которые я нашел в Интернете, модель представления использует некоторую услугу для извлечения собственных данных. Но я не сталкивался ни с одним примером, который принимает параметры конструктора или параметры, передаваемые с более высокого уровня навигации. Как это делается?
Я не хочу использовать ресурс приложения или какой-либо другой метод хранения одноэлементной модели для своей модели, потому что, не то, что я делаю, но что, если бы я хотел отображать сразу несколько головоломок на экране? Каждый GameView
должен содержать свой собственный Game
.
Не только нужна ссылка на Game
модели, но BoardViewModel
, который был создан каким-то образом (см вопроса 1) необходим ссылка на Board
модели, которая принадлежит к Game
модели. То же самое касается всех . Как вся эта информация передается по цепочке? Могу ли я сделать этот очень тяжелый подъем полностью в XAML, или мне придется делать какую-то привязку или другую инициализацию в коде?
Фу!
Я ценю любые советы, которые вы можете дать, даже если это не полный ответ. Я также хочу найти примеры проектов MVVM, которые имеют сходные проблемы для моих собственных. Благодаря тонну!
Я думаю, вы говорите о проблеме вложенных пользовательских элементов управления (см. Http://catel.catenalogic.com/index.htm?gs_viewscontrols_nested_user_controls_problem.htm). Кабель сам по себе недоступен для WinRT (бета-версия), но вы можете хотя бы понять, как я думаю, что это нужно сделать. –