Data Templates and Styles

Let's imagine that we want to implement a variant of tic-tac-toe that's more fun to play (an important feature in most games). For example, one variant of tic-tac-toe only allows players to have three of their pieces on at any one time, dropping the first move off when the fourth move is played, dropping the second move when the fifth is played, and so on. To implement this variant, we need to keep track of the sequence of moves, with each move represented by a PlayerMove object, as shown in Example 8-19.

Example 8-19. A custom type suitable for tracking tic-tac-toe moves

public class PlayerMove : INotifyPropertyChanged { string playerName; public string PlayerName { get { return playerName; } set { if( string.Compare(playerName, value) == 0 ) { return; } playerName = value; Notify("PlayerName"); } } int moveNumber; public int MoveNumber { get { return moveNumber; } set { if( moveNumber == value ) { return; } moveNumber = value; Notify("MoveNumber"); } } bool isPartOfWin = false; public bool IsPartOfWin { get { return isPartOfWin; } set { if( isPartOfWin == value ) { return; } isPartOfWin = value; Notify("IsPartOfWin"); } } public PlayerMove(string playerName, int moveNumber) { this.playerName = playerName; this.moveNumber = moveNumber; } // INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; void Notify(string propName) { if( PropertyChanged != null ) { PropertyChanged(this, new PropertyChangedEventArgs(propName)); } ...

Get Programming WPF, 2nd Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.