Получить объект родительского контейнера объекта в WPF - PullRequest
0 голосов
/ 06 декабря 2011

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

Пример приложения содержит ObservableCollection Team

    class MyApplication2
    {
        ObservableCollection<Team> _Teams = new ObservableCollection<Team>();
        public MyApplication2()
        {
            _Teams.Add(new Team("Team1"));
            _Teams.Add(new Team("Team2"));
            _Teams.Add(new Team("Team3"));

            foreach (Team t in _Teams)
            {
                t.Territories.Add(new Territory("Territory1"));
                t.Territories.Add(new Territory("Territory2"));
                t.Territories.Add(new Territory("Territory3"));
            }
        }
    }

Объект Team, содержащий ObservableCollection Объект Territory

    class Team
    {
        private string _TeamName = "";
        private int _TeamProperty1 = 0;
        ObservableCollection<Territory> _Territories = new ObservableCollection<Territory>();

        public Team(string tName)
        {
            this.TeamName = tName;
        }

        public ObservableCollection<Territory> Territories
        {
            get { return _Territories; }
            set { _Territories = value; }
        }

        public string TeamName
        {
            get { return _TeamName; }
            set { _TeamName = value; }
        }

        public int TeamProperty1
        {
            get { return _TeamProperty1; }
            set { _TeamProperty1 = value; }
        }

    }

Территория объекта

    class Territory
    {
        private string _TerritoryName = "";

        public Territory(string tName)
        {
            this.TerritoryName = tName;
        }

        public string TerritoryName
        {
            get { return _TerritoryName; }
            set { _TerritoryName = value; }
        }

        public void Method1()
        {
            //Do Some Work
        }
    }

Как раз для этого примера я присвоил t значение, но в моем реальном коде у меня есть объект t из других средств. t - это тип объекта территории в ObservableCollection территорий внутри и объекта команды.

        public void SomeWork()
        {
            Territory t = _Teams[1].Territories[0];
            SomeMoreWork(t);
        }

Я удаляю территорию из 1 команды и добавляю ее в другую команду. Что-то вроде следующего. Как мне узнать, к какому объекту команды принадлежит территория?

        public void SomeMoreWork(Territory t)
        {
            Team _Team = ( Parent of t? );
            _Team.Territories.Remove(t);
            _Teams[0].Territories.Add(t);
        }

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

В MyApplication2 запрос linq, такой как:

var TeamsOwnTTerritory = from team in _Teams
                         where team.Territories.Contains(t)
                         select team

выведет вам список команд, имеющих территорию.

Rq: Пока что с вашим кодом ничто не гарантирует, что несколько команд не владеют одной и той же территорией.

0 голосов
/ 07 декабря 2011

Спасибо за информацию Винсент Пил .

Спасибо за идею Саад Имран .

Я изменил следующее и добавил AssociatedTeam к своему объекту территории и установил его в конструкторе. Пока, кажется, он делает то, что искал.

    class Territory
    {
        private string _TerritoryName = "";
        Team _AssociatedTeam = null;

        public Territory(string tName, Team team)
        {
            this.TerritoryName = tName;
            this.AssociatedTeam = team;
        }

        public Team AssociatedTeam
        {
            get { return _AssociatedTeam; }
            set { _AssociatedTeam = value; }
        }

        public string TerritoryName
        {
            get { return _TerritoryName; }
            set { _TerritoryName = value; }
        }


        public void Method1()
        {
            //Do Some Work
        }
    }

А затем поменяйте инициацию территории в конструкторе MyApplication

        t.Territories.Add(new Territory("Territory1", t));
        t.Territories.Add(new Territory("Territory2", t));
        t.Territories.Add(new Territory("Territory3", t));
...