I'm working on making my first game using C# and XAML for Windows 8. I'm still learning the core concepts and best practices, and MVVM has been a hurdle. I'll attempt to ask the question in two parts.
Background
The game I'm making is Sudoku. Sudoku has a board that contains a 9x9 grid of tiles. I have three models - Game
, Board
, and Tile
. When a Game
is created, it automatically creates a Board
, and when the Board
is created, it creates 81 (9x9) Tiles
.
1. With a hierarchy of views, how are corresponding view models created?
To match the hierarchy of models, I would like to have a hierarchy of views (GameView
contains a BoardView
which contains 81 TileViews
). In XAML, it's pretty easy to create this hierarchy of views with user controls, but I don't understand how the view models get created.
In the examples I've seen, the data context of a user control is often set to the view model (using the ViewModelLocator
as a source) which creates a fresh instance of the view model. This seems to work well if you have a flat view, but also seems like it gets messy when you have a hierarchy. Does the GameView
create a GameViewModel
and leave it up to its BoardView
child to create a BoardViewModel
? If so, how does the GameViewModel
communicate with the BoardViewModel
? Can the BoardViewModel
communicate back up the hierarchy to the GameViewModel
?
2. How does a view model get model data?
In iOS, I would start by using a service to fetch a Game
model that was pre-populated with data. I would then create a GameViewController
view controller (which was in charge of creating the view) and pass the Game
to it. In MVVM, I see the value in having a view be in charge of creating its own view model (ideally using a ViewModelLocator
), but I don't understand how that view model gets the model.
In all of the examples I've found online, the view model uses some service to fetch its own data. But I haven't come across any example that accepts constructor params or params passed from a higher level of navigation. How is this done?
I don't want to use an application resource or some other kind of singleton storage method for my model because, not that I do, but what if I wanted to display multiple puzzles on the screen at once? Each GameView
should contain its own Game
.
Not only does the GameViewModel
need a reference to the Game
model, but the BoardViewModel
that was created somehow (see question 1) needs a reference to the Board
model that belongs to the Game
model. The same goes for all the Tiles
. How is all this information passed down the chain? Can I do this much heavy lifting entirely within XAML, or am I going to have to do some sort of binding or other initialization in code?
Phew!
I appreciate any advice you can give, even if it's not a full answer. I'm also keen to find any examples of MVVM projects that share similar challenges to my own. Thanks a ton!