MVVM:数据更改时在画布上更新图形

时间:2014-03-30 17:57:41

标签: c# wpf xaml canvas mvvm

我目前正在尝试使用WPF创建一个小型Battleship应用程序。有些人为此宣传了MVVM模式,所以我试了一下(我没有WPF或Forms的经验)。在一些初步问题之后,一切似乎都很顺利,但是现在我碰到了一堵我不知道如何突破的墙:

你可以想象,有一个战列舰“网格”(不要与WPF网格混淆,虽然我只是想知道我可以使用的东西也许......让我想一想,但答案是以下问题仍然让我感兴趣,我想在Canvas上画画。我之前没有MVVM就成功了,但我只是不知道如何用MVVM做到这一点。画布上绘制的“网格”应该包含始终绘制的内容,即11条水平线和11条垂直线,以及船只(可以包含任何形状,位于由交叉线)。我的BSGrid的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Battleship.Entities
{
  public class BSGrid
  {
    public const int Size = 10;

    // TileState is an enum consisting of Unchecked, Checked, ShipPart,...
    private TileState[,] sea = new TileState[Size, Size];

    public TileState this[BSPoint pos]
    {
      get { return sea[pos.x, pos.y]; }
      set { sea[pos.x, pos.y] = value; }
    }

    public TileState this[int x, int y]
    {
      get { return sea[x, y]; }
      set { sea[x, y] = value; }
    }

    public BSGrid()
    {
    }
  }
}

关于如何将画布“内容”绑定到BSGrid的数据,您有什么建议吗?当我之前绘制它时,我只是通过了数组并画了一个矩形,如果瓷砖上有一个船舶部件或类似物。我当然可以将网格的一些数据提取到比如要绘制的矩形列表中,但我不知道这是否“好”并且仍然不知道如何从ViewModel中绘制一点都不我会很高兴任何建议: - )

1 个答案:

答案 0 :(得分:0)

我通过创建自己的类

来实现这一目标
public class BattleshipCanvas : Canvas
{
  // ...
}

DependencyPropertyBSGrid,这是WPF中的“标准做法”,但我当时并不知道。