Использование вложенных объектов ObservableCollection для создания окна ContextMenu WPF - PullRequest
1 голос
/ 29 ноября 2011

Спасибо за помощь заранее.Первая публикация здесь.

Я включил пример кода.Я хотел бы динамически построить ContextMenu на основе этих пользовательских объектов (ObservableCollection).Я могу связать ContextMenu с первым уровнем Team, но вы также можете связать второй уровень "ContextMenu? / MenuItem?"для территорий.Мне нужно увидеть территории в команде, когда команда выделена.

Мой объект команды

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

        public Team()
        {

        }

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

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

        public int TeamProperty2
        {
            get { return _TeamProperty2; }
            set { _TeamProperty2 = value; }
        }
    }

Мой объект территории

    class Territory
    {
        private int _TerritoryProperty1 = 0;

        public int TerritoryProperty1
        {
            get { return _TerritoryProperty1; }
            set { _TerritoryProperty1 = value; }
        }

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

Приложение

    class MyApplication
    {
        ObservableCollection<Team> _Teams = new ObservableCollection<Team>();
        ContextMenu _TeritorySwitcher = new ContextMenu();
        public MyApplication()
        {
            AddTeam()
        }

        public void AddTeam()
        {
            Team _Team1 = new Team();
            _Team1.Territories.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Territories_CollectionChanged);
            _Teams.Add(_Team1);

            Team _Team2 = new Team();
            _Team2.Territories.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Territories_CollectionChanged);
            _Teams.Add(_Team2);


            Team _Team3 = new Team();
            _Team3.Territories.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Territories_CollectionChanged);
            _Teams.Add(_Team3);

            foreach (Team t in _Teams)
            {
                t.Territories.Add(new Territory());
                t.Territories.Add(new Territory());
                t.Territories.Add(new Territory());
                t.Territories.Add(new Territory());
            }
        }

        void Territories_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            ObservableCollection<Team> _TeamsSort = new ObservableCollection<Team>(_Teams.OrderBy(tm => tm.TeamProperty1));
            _TeritorySwitcher.ItemsSource = _TeamsSort;
            _TeritorySwitcher.DisplayMemberPath = "TeamProperty2";
        }

    }

Теперь в моем ContextMenu показаны команды (3 из них), но я не могу понять, как показать территории (в каждой команде должно быть 4)

1 Ответ

1 голос
/ 30 ноября 2011

Хорошо, я понял это.Спасибо за направление.Вот новый класс MyApplication.В примере у меня нет никаких данных, но вы можете заполнить их, если вам нужно увидеть эту работу.Это просто пример фреймворка.

    class MyApplication
    {
        ObservableCollection<Team> _Teams = new ObservableCollection<Team>();
        ContextMenu _TeritorySwitcher = new ContextMenu();
        public MyApplication()
        {

        }

        public void AddTeam()
        {
            _Teams.Add(new Team());
            _Teams.Add(new Team());
            _Teams.Add(new Team());
            _Teams.Add(new Team());

            foreach (Team t in _Teams)
            {
                t.Territories.Add(new Territory());
                t.Territories.Add(new Territory());
                t.Territories.Add(new Territory());
            }

            SetContextMenu();
        }

        private void SetContextMenu()
        {
            HierarchicalDataTemplate _hdtTerritories = new HierarchicalDataTemplate();
            _hdtTerritories.DataType = typeof(Territory);

            HierarchicalDataTemplate _hdtTeams = new HierarchicalDataTemplate();
            _hdtTeams.DataType = typeof(Team);

            FrameworkElementFactory _TeamFactory = new FrameworkElementFactory(typeof(TreeViewItem));
            _TeamFactory.Name = "txtTeamInfo";
            _TeamFactory.SetBinding(TreeViewItem.HeaderProperty, new Binding("TeamProperty1"));

            FrameworkElementFactory _TerritoryFactory = new FrameworkElementFactory(typeof(TreeViewItem));
            _TerritoryFactory.Name = "txtTerritoryInfo";
            _TerritoryFactory.SetBinding(TreeViewItem.HeaderProperty, new Binding("TerritoryProperty1"));


            _hdtTeams.ItemsSource = new Binding("Territories");

            _hdtTeams.VisualTree = _TeamFactory;
            _hdtTerritories.VisualTree = _TerritoryFactory;

            _hdtTeams.ItemTemplate = _hdtTerritories;

            _TeritorySwitcher.ItemTemplate = _hdtTeams;
            _TeritorySwitcher.ItemsSource = this._Teams;
        }
    }
...