使用Nested ObservableCollection创建ContextMenu WPF窗口

时间:2011-11-28 22:30:01

标签: wpf dynamic contextmenu

提前感谢您的帮助。第一次在这里发帖。

我已经包含了一些示例代码。我想基于这些自定义对象(ObservableCollection)动态构建ContextMenu。我可以将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 个答案:

答案 0 :(得分:1)

好的,我明白了。谢谢你的指导。这是新的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;
        }
    }