【发布时间】:2017-03-27 17:55:00
【问题描述】:
我正在尝试创建一个记忆游戏,同时严格遵循 MVVM 模式来学习如何使用它。现在我在运行时创建视图时遇到了问题。
我创建了以下项目结构:
- 模型项目
- -MemoryCardModel30
- -卡片
- ViewModel 项目
- -MainWindowViewModel
- -CardViewModel
- 查看项目
- -卡片视图
- StartApplication 项目
- -主窗口视图
依赖如下:StartApplication项目->View项目->ViewModel项目->Model项目
单击 MainWindowView 上的按钮后,MainWindowViewModel 中该按钮的 ICommand 函数将从模型项目加载 MemoryCardModel30 实例。对于 MemoryCardModel30 实例中的每张卡,都会创建一个 CardViewModel。
现在我面临的问题是:如何创建 CardView 实例,如何将它们的 DataContexts 链接到 CardViewModels 以及如何在 MainWindowView 上安排/分配 CardViews? ViewModel 项目无法创建视图,因为它不依赖于 View 项目(会创建循环依赖并破坏模式)。如何在遵循 MVVM 模式的同时解决这个问题?
P.S.: CardViews 需要精确定位 x 和 y 位置。这将需要一些复杂的计算,这些计算应该通过相应的 CardViewModel。所以我认为像网格这样的基本布局是不够的。
【问题讨论】:
-
您使用的是框架,您的方法是“模型优先”还是“视图优先”?此外,您也许可以让 WrapPanel 做您想做的事...msdn.microsoft.com/en-us/library/…
-
这就是为什么我们在我的工作中使用 MVPVM 的原因:将模型链接到视图然后显示这些视图并不是一项非常适合 MVVM 的工作,但是是Presenter的工作
-
@BerinLoritsch 不,我目前没有使用任何框架。我想从一开始就学习这种模式。我只熟悉 EntityFramework 上下文中的“模型优先”,但不熟悉 MVVM。但是,在这种情况下,我从 ViewModel 开始,然后是模型,最后是视图。
-
通常这种目标是通过在主视图模型上公开一组卡片视图模型、在视图端绑定
ItemsControl(或一些派生词)并使用DataTemplate来实现的(通过ItemsControl.ItemTemplate设置)来定义单张卡片的外观。要以非平凡的方式安排项目,您可以将ItemsControl.ItemsPanel设置为您喜欢的Panel- 无论是WrapPanel、Grid、Canvas还是任何其他Panel(在非常复杂的场景中,通常更容易编写自己的面板,而不是尝试让库存面板来做您的投标)。
标签: c# wpf design-patterns mvvm