【发布时间】:2019-05-30 21:21:33
【问题描述】:
我正在使用 WPF 开发战舰游戏。我有一个 Coordinate 模型和我与 Grid 对象绑定的 ViewModel。此 ViewModel 具有 Coordinate 对象列表的属性,并将每个对象描述为带有 Label 的 Border。 p>
问题是 Coordinate 类的数据不足以满足我的 Border 视图样式。它只有 Row 和 Column 属性,但我还想知道它是否包含 Ship 以及是否该 Ship 受伤或沉没。根据这些值,我想更改 Border 对象的 Background 颜色。
场景 1
如果我将 Border 与 Ship 绑定,那么我将失去与 Coordinate 对象的绑定(这很重要,我的 >边界仍然取决于它)。
场景 2
如果我重新定义我的 ViewModel 以成为 Border 的一对一绑定(我的 ViewModel 实例数以匹配多个Border 对象的实例)然后感觉有点脏,不够优雅。但在这种情况下,我将能够定义我的 Border 使用并将绑定到的所有必需属性。
场景 3
如果我创建一个额外的类,它将是 Coordinate 和 Ship 的混合体,并且该类将在列表中用作 ViewModel 属性,并且该列表将与我的 Border 绑定,然后我看到两个问题:
- 此类的属性将相互依赖。让我们 说会有一个属性 HasShip 然后它有一个属性 IsShipSunk。但是当第一个时,后一个没有意义 值为 false。
- 不知何故,我需要为我的 Coordinate 和 Ship 类构建一种方法 与该附加类进行通信,以便值在 同步。感觉像是一项额外的工作。
场景 4
如果我更改我的 坐标 模型类以包含所有必需的属性,那么我们将遇到我在之前的“如果”(第一点)中描述的相同问题。
场景 5
如果我根本不使用绑定,那么我不知道在我的 Border 视图和 Coordinate 之间实现链接的最佳做法(在这种情况下)是什么 模型。我还需要获取 Coordinate 所属的 Battlefield 对象,以便能够从那里获取所有 Ship 对象。这种方法感觉就像“如果您不使用 MVVM,为什么要选择 WPF?”。我之所以选择 WPF,是因为我喜欢 C#,还因为 WPF 具有出色的 UI 控件架构。
我非常清楚 WPF 和 MVVM 可能不适合像这样的游戏,而且它是为不同的目的而设计的。但我仍然想找到一个很好的解决方案,以防万一。
所以,简而言之:如何构建以下内容:
- 用户点击边框(看起来像一个单元格)
- 获取对应的坐标对象
- 坐标所属的对应战场 已提取
- Ship 对象的迭代被执行以检查是否有任何 它们包含该坐标
- 根据结果更改我的边框颜色 背景(蓝色 - 未命中时,橙色 - 被击中时,黑色 - 被击中时 Ship 沉没(请注意,我希望 all 相关的 Border 对象发生变化 当船沉没时,颜色从橙色变为黑色))
非常感谢。
【问题讨论】:
标签: c# wpf mvvm data-binding architecture