2014-03-30 3 views
0

현재 WPF를 사용하여 약간의 Battleship 응용 프로그램을 만들려고합니다. 어떤 사람들은이를 위해 MVVM 패턴을 광고 했으므로 WPF 또는 Forms에 대한 경험이 없습니다. 처음 몇 가지 문제가 있으면 모든 것이 잘 진행되고있는 것 같지만 지금 당장 벽을 뚫고 나갈 것입니다.MVVM : 데이터가 변경 될 때 캔버스에서 도면 업데이트

상상할 수있는 것처럼, 전함 "그리드"가 있습니다. WPF 그리드와 혼란 스럽지만, 대신에 내가 사용할 수있는 아이디어가 생겼다. 생각해 보자.하지만 다음 질문에 대한 답은 여전히 ​​캔버스에 그리기를 원한다. 이전에 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의 데이터에 캔버스 "내용"를 결합하는 방법으로 어떤 제안이 있습니까? 이전에 그림을 그렸을 때 타일이나 배 부분에 배 부분이 있으면 사각형을 그렸습니다. 필자는 당연히 그릴 수있는 Rect List에 그리드의 일부 데이터를 추출 할 수 있었지만 이것이 "좋을지"는 모르겠지만 여전히 ViewModel에서 그리는 방법을 알지 못합니다. 조금도. 나는 이것이 BSGrid에 대한 DependencyProperty 내 자신의 클래스

public class BattleshipCanvas : Canvas 
{ 
    // ... 
} 

를 작성하여 일을 가지고 WPF에서 '표준 관행'의 일종으로 내가

+1

[This answer] (http://stackoverflow.com/a/22325266/1136211)에서 볼 수 있듯이 ItemsControl의 ItemsPanel 인 Canvas에서 선박을 직사각형으로 모델링 할 수 있습니다. – Clemens

+0

@ 클레멘스 (Clemens) 나는 여기에 해결책을 찾을 때까지 그 하나를 발견했다고 생각하지만, 어떤 이유로 그것을 버렸다. 당분간 MVVM없이 게임을 시작했지만 대답은 여전히 ​​흥미 롭습니다 (위에서 쓴 것처럼). 나는 다른 대답을 일반화하여 사용할 수 있다고 생각합니다. 감사! – InvisiblePanda

+0

절대 좌표 대신 그리드 셀 인덱스를 사용하려면 캔버스를 그리드로 바꾸고 'Grid.Column','Grid.Row','Grid.ColumnSpan' 및'Grid.RowSpan' 속성을 ItemStyle 및 ItemTemplate입니다. – Clemens

답변

0

:-) 어떤 제안을 드리겠습니다하지만, 나는 그 당시에 몰랐다.

관련 문제