繁体   English   中英

C#WPF中另一个类的类中的绑定属性

[英]Binding property in class in another class in C# WPF

我做了一个简单的游戏,两个玩家轮流玩。 有时,您可以转2次或更多。 一切正常,除了我想显示每个玩家通过绑定进行了多少回合。

我有页面gamePage,类Game和Class Player:

页:

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:当然还有更多代码! 这并不是说我不想让您知道我在做什么,这对绑定没有用,我也不想让您分心。

编辑:错别字

player1为属性而不是字段。 Binding可以遵循属性而不是字段的路径。

public Player player1{ get; set; }

但是,由于它是一个属性,因此您可能要更改名称的拼写...

好的,就像@wkl所说的那样,让玩家拥有属性而不是领域是一种解决方案。 我已经在类Player等的属性Rounds中尝试过...但是这样做:

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

在我心中没有发生。 Ofc对player2这样做将使两个玩家都能实现。

谢谢!

编辑:我现在不需要类Player eventHandler

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM