Search code examples
c#windows-phone-7getter-setter

Getters and Setters, getting multiple fields


public class Teams : INotifyPropertyChanged
    {
        public string CombinedTeams
        {
            get
            {                   
                return Combined;
            }

            set
            {                    
                {                                               
                    CombinedTeams += value;
                    NotifiyPropertyChanged("Combined"); 
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifiyPropertyChanged(string p)
        {
            if (null != p)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(p));
            }
        }
        private string Combined
        {

            get
            {
                return " " + HomeTeam + " " + HomeScore + " - " + AwayScore + " " + AwayTeam;
            }
            set 
            {
                { 
                    Combined += value;
                }
            }
        }
        public string HomeTeam { get; set; }
        public string AwayTeam { get; set; }
        public string HomeScore { get; set; }
        public string AwayScore { get; set; }
    }

I got a problem, when trying combine my strings together and having one LONG string that contains all the values from when I parse my XML I only get the First set of values,

basically I get

Team1 Score1 : Score2 Team2

as opposed to Team1 Score1 : Score2 Team2 Team3 Score3 : Score4 Team4 Team5 Score5 : Score6 Team6

I am binding my Control to CombinedTeams

could you guys help me out? I just want to store the previous string and then combine the new string with the old one, I cant see it being hard but this is confusing me and reading up on it makes me more confused...

Thanks,

John


Solution

  • The reason you are getting the incorrect results is because you have one property referring to another property, and the second property always returns a specific value.

    This block of code, when called from elsewhere, will return the results of some other variable called "Combined" which you have defined below...

    public string CombinedTeams                      
    {                      
        get                      
        {                                         
            return Combined;                      
        }                      
        ...
    }           
    
    private string Combined                        
    {                        
        get                        
        {                        
            return " " + HomeTeam + " " + HomeScore + " - " + AwayScore + " " + AwayTeam;                        
        }
        ...
    }
    

    Everything else is academic because you're getter(s) essentially always return " " + HomeTeam + " " + HomeScore + " - " + AwayScore + " " + AwayTeam.

    I suspect you will want to restructure your code to be something more like this

    public class Teams : INotifyPropertyChanged
    {
        private string Combined; // Backing for CombinedTeams
        public string CombinedTeams
        {
            get
            {
                return Combined;
            }
            set
            {
                // This only concatinates values; Combined will get longer each time.
                Combined += value;
                // ViewModels should always notify after the vale has changed
                NotifyOfPropertyChange("CombinedTeams");
            }
        }
    
        // Adds a new team, assuming HomeTeam, HomeScore, AwayScore, and AwayTeam have been initialized
        public void AddTeam()
        {
            CombinedTeams = " " + HomeTeam + " " + HomeScore + " - " + AwayScore + " " + AwayTeam;              
        }                     
    }
    

    Certainly there are better ways to do that, but that should get you a start, I hope.

    General rule (broken all the time by the code-ninjas, which is fine) is that a Property shouldn't do any calculations of it's own, it's really there to allow public access to private data in the class.

    It might be worthwhile to run through a couple of articles on C# Properties. Here are some suggestions to get you started: http://msdn.microsoft.com/en-us/library/x9fsa0sw(v=vs.80).aspx and http://msdn.microsoft.com/en-us/library/aa288470(v=vs.71).aspx and of course, some Good Search Results