2011-11-28 2 views
1

미리 도움을 청하십시오. 처음 여기에 게시했습니다.중첩 ObservableCollection을 사용하여 ContextMenu WPF 창 만들기

샘플 코드가 약간 포함되어 있습니다. 이러한 사용자 지정 개체 (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

좋아, 알아 냈어. 방향 주셔서 감사합니다. 다음은 새로운 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; 
     } 
    }