2017-01-26 3 views
1

Я сделал простую игру, в которой два игрока по очереди. Иногда вы можете сделать 2 или более поворотов. Все работает отлично, за исключением того, что я хочу показать, сколько поворотов каждый игрок сделал с помощью привязки.Связывание собственности в классе в другом классе в C# WPF

У меня есть страница gamePage, класс игры и класс игрока:

страница:

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: Конечно, есть еще код! Дело не в том, что я не хочу, чтобы вы знали, что я делаю, это просто бесполезно для привязки, и я не хочу, чтобы вы отвлекались от этой проблемы.

Edit: опечаток

ответ

2

Сделать player1 свойство вместо поля. Binding может следовать по пути свойств, но не по полям.

public Player player1{ get; set; } 

Однако, вы можете изменить написание имени теперь, что это свойство ...

+0

Думаю, я пробовал это, но спасибо. Я попробую еще раз (я думаю, что в то время у меня не было eventHandler). – Stepan

0

Ok, так как @wkl сказал, что делает игроков свойство вместо поля является решением. Я попробовал, что в собственности Rounds в классе Player и т.д ... но сделать это:

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

не происходило в моей голове. Ofc делает это за player2, чтобы это произошло для обоих игроков.

Спасибо!

Редактировать: Мне не нужно eventHandler в классе Player сейчас.

Смежные вопросы