C#WPF

时间:2017-01-26 12:18:46

标签: c# wpf data-binding

我做了一个简单的游戏,两个玩家轮流。有时,您可以进行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 allRoundsMakeAMove(),我会增加该属性+将其绑定到textBlock,它可以工作!但是当我需要绑定另一个类中的属性时 - 我不知道该怎么做,我什么都没发现。我做错了吗?

PS:当然还有更多代码!并不是因为我不想让你知道我在做什么,它只是没有用于绑定,我不希望你分散注意力。

编辑:拼写错误

2 个答案:

答案 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