Получатели и сеттеры, получающие несколько полей - PullRequest
0 голосов
/ 24 августа 2011
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; }
    }

У меня возникла проблема, когда я пытался объединить мои строки и получить одну LONG-строку, содержащую все значения, когда я анализировал мой XML, я получал только первый набор значений,

, в основном яполучить

Team1 Score1 : Score2 Team2

в отличие от Team1 Score1 : Score2 Team2 Team3 Score3 : Score4 Team4 Team5 Score5 : Score6 Team6

Я связываю свой контроль с CombinedTeams

Не могли бы вы, ребята, помочь мне?Я просто хочу сохранить предыдущую строку, а затем объединить новую строку со старой, я не вижу, чтобы это было сложно, но это сбивает меня с толку, и чтение об этом еще больше сбивает меня с толку ...

Спасибо,

Джон

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

Я не уверен, что вы ожидаете, last всегда инициализируется как "", поэтому + = не имеет значения.

Похоже, класс под названием Команды - это действительно игра?

И я не думаю, что установка HomeTeam, AwayTeam, HomeScore, AwayScore снова и снова (а затем каким-то образом сохранять это внутри) является хорошим способом отслеживания нескольких игр.

Почему бы вам не взглянуть на коллекцию игр?

Попробуйте что-то вроде этого:

В библиотеке GamesLib:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace GamesLib
{
    public class Game
    {
        public string HomeTeam { get; private set; }
        public string AwayTeam { get; private set; }
        public string HomeScore { get; private set; }
        public string AwayScore { get; private set; }

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

        public Game(string HomeTeam, string AwayTeam, string HomeScore, string AwayScore)
        {
            this.HomeTeam = HomeTeam;
            this.HomeScore = HomeScore;
            this.AwayTeam = AwayTeam;
            this.AwayScore = AwayScore;
        }
    }

    public class Games : List<Game>, INotifyPropertyChanged
    {
        public string CombinedTeams
        {
            get
            {
                var str = "";
                foreach (Game g in this)
                {
                    str += g.Combined;
                }
                return str;
            }
        }

        public new void Add(Game g)
        {
            base.Add(g);
            if ( PropertyChanged != null ) {
                PropertyChanged(this, new PropertyChangedEventArgs("CombinedTeams"));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

В консольной программе:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GamesLib;

namespace TestHarness
{
    class Program
    {
        static void Main(string[] args)
        {
            var gs = new GamesLib.Games();
            gs.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(gs_PropertyChanged);
            var g = new Game("hometeam", "awayteam", "1", "0");
            gs.Add(g);
            g = new Game("lions", "bears", "1", "0");
            gs.Add(g);
            Console.WriteLine("Final result:" + gs.CombinedTeams);
        }

        static void gs_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            var gs = sender as Games;
            Console.WriteLine("Changed: " + gs.CombinedTeams);
        }
    }
}
2 голосов
/ 24 августа 2011

Ваш код объединяет новое значение в пустую строку (last = "").
Возможно, вы хотите объединить предыдущее значение.

1 голос
/ 24 августа 2011

Причина получения неверных результатов в том, что у вас есть одно свойство, ссылающееся на другое свойство, а второе свойство всегда возвращает определенное значение.

Этот блок кода, когда вызывается из другого места, будет возвращать результаты некоторой другой переменной с именем "Combined", которую вы определили ниже ...

public string CombinedTeams                      
{                      
    get                      
    {                                         
        return Combined;                      
    }                      
    ...
}           

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

Все остальное является академическим, потому что вы, как правило, всегда получаете "" + + HomeTeam + "" + HomeScore + "-" + AwayScore + "" + AwayTeam.

Я подозреваю, что вы захотите реструктурировать свой код так, чтобы он был похож на этот

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;              
    }                     
}

Конечно, есть лучшие способы сделать это, но я надеюсь, что это поможет вам начать.

Общее правило (все время нарушается кодом-ниндзя, что вполне нормально): свойство не должно выполнять никаких собственных вычислений, оно действительно позволяет публичному доступу к частным данным в классе.

Возможно, стоит прочитать пару статей о свойствах C #. Вот несколько советов, с которых можно начать: http://msdn.microsoft.com/en-us/library/x9fsa0sw(v=vs.80).aspx и http://msdn.microsoft.com/en-us/library/aa288470(v=vs.71).aspx и, конечно, некоторые Хорошие результаты поиска

...