【发布时间】:2012-09-01 04:19:37
【问题描述】:
我正在为 Windows 8 使用 C# 和 XAML 制作我的第一款游戏。我仍在学习核心概念和最佳实践,而 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 模型,而且以某种方式创建的BoardViewModel(参见问题1)需要引用属于Game 的Board 模型模型。所有Tiles 也是如此。所有这些信息是如何沿着链条传递的?我可以完全在 XAML 中完成如此繁重的工作,还是必须在代码中进行某种绑定或其他初始化?
呼!
感谢您提供的任何建议,即使它不是完整的答案。我也很想找到任何与我自己有类似挑战的 MVVM 项目示例。非常感谢!
【问题讨论】:
-
我认为您在谈论嵌套用户控件问题(请参阅catel.catenalogic.com/…)。 Catel 本身还不能用于 WinRT(虽然有测试版),但你至少可以理解我认为应该如何做。
标签: c# windows xaml mvvm viewmodel