我做了一个简单的游戏,两个玩家轮流。有时,您可以进行2次或更多次转弯。一切都很好,除了我想表明每个玩家通过绑定做了多少转。
我有页面游戏页面,类游戏和类玩家:
页:
public partial class gamePage : Page
{
private Game game;
// konstruktor
public gamePage(string strPlayer1, string strPlayer2)
{
InitializeComponent();
Hrac player1= new Hrac(strPlayer1, 'R');
Hrac player2= new Hrac(strPlayer2, 'B');
this.game = new Game(player1, player2, width, height);
// binding
DataContext = game;
// etc...
}
// here is: mouse click - game.MakeAMove();
}
游戏:
class Game : INotifyPropertyChanged
{
// binding
public event PropertyChangedEventHandler PropertyChanged;
// players
public Player player1;
public Player player2;
private Player activePlayer;
}
// konstruktor
public Game(Player player1, Player player2, int width, int height)
{
// init of players
this.player1 = player1;
this.player2 = player2;
this.activePlayer = player1;
}
public void MakeAMove()
{
activePlayer.Rounds++;
makeAChange("player1");
}
// binding - dle itNetwork
protected void makeAChange(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
播放器:
class Player : INotifyPropertyChanged
{
// binding
public event PropertyChangedEventHandler PropertyChanged;
private int rounds;
public int Rounds {
get { return rounds; }
set
{
rounds = value;
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("Rounds");
}
}
public char Color { get; set; }
public string Name { get; set; }
public Hrac(string name, char color)
{
this.Name = name;
this.Color = color;
Rounds = 0;
}
public override string ToString()
{
return this.Name;
}
// binding - via MSDN
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
XAML:
<TextBlock Name="tbPlayer1Rounds" Text="{Binding player1.Rounds}" />
基本上玩家轮流,当他们点击时,移动将发生并且activePlayer将再转一圈(player1.Rounds),然后玩家将交换等等......
如你所见,我尝试过很多东西。首先在游戏中制作一个事件处理程序,然后在一个玩家本身。让他们公开。没有。绑定不起作用。如果我在Game中有属性,例如:int allRounds
和MakeAMove()
,我会增加该属性+将其绑定到textBlock,它可以工作!但是当我需要绑定另一个类中的属性时 - 我不知道该怎么做,我什么都没发现。我做错了吗?
PS:当然还有更多代码!并不是因为我不想让你知道我在做什么,它只是没有用于绑定,我不希望你分散注意力。
编辑:拼写错误
答案 0 :(得分:2)
将player1
设为属性而不是字段。 Binding
可以遵循属性路径而不是字段。
public Player player1{ get; set; }
但是,您可能希望更改名称的拼写,因为它是属性...
答案 1 :(得分:0)
好吧,正如@wkl所说,制造球员财产而非球场是一种解决方案。我已经在课程Rounds
中的属性Player
等尝试了这一点......但是请这样做:
public Player Player1 { get; set; }
public Player Player2 { get; set; }
没有出现在我的脑海里。对player2
执行此操作将为两位玩家带来好处。
谢谢!
编辑:我现在不需要eventHandler
课程Player
。