2017-01-26 9 views
1

シンプルなゲームを作って、2人のプレーヤーが交代しました。場合によっては、2ターン以上かかることがあります。各プレイヤーが拘束力を持って何回転したかを表示したいのを除いて、すべてうまく動作します。C#WPFの別のクラスのクラスでのバインディングプロパティ

ページ:

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)); 
} 

プレーヤー:

私はページgamePage、クラスのゲームやクラスプレーヤーを持っている

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}" /> 

Basiclyプレイヤーは、彼らがクリックしたときに、移動が起こるのだろうとactivePlayerは、1以上のターン(player1.Rounds)を持つことになります、そしてプレイヤーが入れ替わりますし、あなたが見ることができるようにように... は、私が持っている、ターンを取りますたくさんのことを試しました。まずゲームでイベントハンドラーを作ってから、プレーヤー自身でイベントハンドラーを作ります。それらを一般に公開しました。何もない。バインディングは機能しません。私はゲームでプロパティを持っている場合:int allRoundsMakeAMove()私はそのプロパティを増やす+ textBlockにバインドする、それは動作します!しかし、私がする必要があるとき別のクラスにあるクラスのプロパティをバインド - 私は何をすべきかわからない、私は何も見つかりませんでした。私は何か間違っているのですか?

PS:もちろんコードがあります!私はあなたが何をしているのかを知りたくないというわけではなく、拘束力がないだけで問題から気をそらさないようにしています。

編集:タイプミス

答えて

2

player1代わりに、フィールドのプロパティを確認します。 Bindingはプロパティのパスに従うことはできますが、フィールドは通過できません。 @wklは選手プロパティの代わりに、フィールドが解決されながら、言ったように

public Player player1{ get; set; } 

しかし、あなたは、

+0

私はそれを試みたと思うが、ありがとう。私はもう一度試してみます(私は、その時にイベントハンドラを持っていなかったと思います)。 – Stepan

0

[OK]を...今それが財産であることを名前のスペルを変更することもできます。私はクラスなどPlayer内のプロパティRoundsであることを試してみました...しかし、この作成している:

public Player Player1 { get; set; } 
public Player Player2 { get; set; } 

は私の心には発生しませんでした。 Ofcがplayer2のためにそれをすることは、両方のプレーヤーのために起こります。

ありがとうございます!

編集:今はのeventHandlerの編集は必要ありません。

関連する問題