我正在使用C#和XAML为Windows 8制作我的第一个游戏。我仍在学习核心概念和最佳实践,MVVM一直是一个难点。我将尝试分两部分提出问题。
背景
我正在制作数独游戏。数独有一个包含9x9网格的板。我有三个模型-Game
、Board
和Tile
。当创建一个Game
时,它会自动创建一个Board
,而当创建Board
时,它会创建81(9x9)个Tiles
。
1、如何创建相应的视图模型?
为了匹配模型的层次结构,我想要一系列视图(GameView
包含一个BoardView
,其包含81个TileViews
)。在XAML中,使用用户控件创建这种视图层次结构非常容易,但我不明白视图模型是如何创建的。
在我看到的示例中,用户控件的数据上下文通常设置为视图模型(使用ViewModelLocator
作为源),它会创建一个全新的视图模型实例。如果你有一个扁平的视图,这似乎是很好的,但当你有一个层次结构时,它似乎变得混乱。那么,GameView
会创建一个GameViewModel
,然后由其子控件BoardView
创建一个BoardViewModel
吗?如果是这样,GameViewModel
如何与BoardViewModel
通信?BoardViewModel
是否可以向上通信到GameViewModel
?
2、视图模型如何获取模型数据?
在iOS中,我会使用一个服务获取预加载数据的Game
模型。然后创建一个GameViewController
视图控制器(负责创建视图),并将Game
传递给它。在MVVM中,我认为让视图自己创建其自己的视图模型(最好使用ViewModelLocator
)是有价值的,但我不明白这个视图模型如何获取模型。在我找到的所有示例中,视图模型都使用某些服务来获取自己的数据。但我没有遇到过任何接受构造函数参数或从更高级别导航传递参数的示例。这是如何实现的呢?
我不想使用应用程序资源或其他单例存储方法来存储我的模型,因为即使我想在屏幕上同时显示多个拼图,每个
GameView
也应该包含自己的Game
。不仅
GameViewModel
需要引用Game
模型,而且某种方式(参见问题1)创建的BoardViewModel
也需要引用属于Game
模型的Board
模型。对于所有的Tiles
也是一样的。所有这些信息是如何向下传递的?我能够完全在XAML中完成这么多的繁重工作,还是需要在代码中进行一些绑定或其他初始化操作?哇!非常感谢您能提供任何建议,即使不是完整的答案。我也很想找到与我自己面临的类似挑战相似的MVVM项目示例。非常感谢!