2014-09-04 9 views
0

의 인덱스를 알고하는 방법 :이 같은 XAML에서이 동적으로 생성 TabItem의

뷰 모델에서
<controls:TabControl Grid.Row="0" BorderThickness="0" Background="White" 
         ItemsSource="{Binding TabList, Mode=TwoWay, Converter={StaticResource TabConverter}}"       
         SelectedItem="{Binding CurrentItem, Mode=TwoWay}"/> 

난이 : (XAML에서)

private TabItem currentItem; 
    public TabItem CurrentItem 
    { 
     get { return currentItem; } 
     set 
     { 
      //currentItem.Content    
      currentItem = value; 
      int index = currentItem.TabIndex; //IT GIVES STRANgE INDEX ON DEBUGGING ob Tab click (like 22255788586)     
      OnPropertyChanged("CurrentItem"); 
     } 
    } 

그러나이 tablist에서이 같이 동적으로 생성된다 :

public void AddVersion(ProgramVersion pv) //it creates the TabList 
     { 
      if (pv != null) 
      {    
       if (index == -1) 
       {      
        TabList.Add(new ProgramVersionItemViewModel(pv));      
        OnPropertyChanged("TabList");     
       }     
      } 
     } 

버튼을 누를 때마다 AddVersion (version) 함수를 호출합니다. TabList에 추가됩니다.

문제는 동적으로 생성 된 TabItems (TabList)의 수를 CurrentItem으로 누른 다음 이상한 주소가 매우 큼 (예 : 222557456) 문제입니다.

현재 항목의 색인을 얻는 방법이 잘못 되었습니까? (int index = currentItem.TabIndex;)?

+1

'TabIndex'은 *하지 * 탭의 인덱스 -이 컨트롤 사이 순환 Tab 키를 누른 상태에서 컨트롤을 주문할있다. – Luaan

+1

** TabIndex **는 TabControl 내부의 항목 인덱스를 의미하지 않습니다. ViewModel List가 있으므로 ** SelectedItem **은 TabItem을 반환하지 않을 수도 있고, 현재 TabItem에 바인딩 된 ViewModel을 참조해야합니다. ** TabList.IndexOf (CurrentItem) ** 대신이 시도 할 수 있습니다. – Claw

+0

@ Luaan 그래서 현재 항목의 인덱스를 알기 위해 솔루션을 어떻게 수행할까요? CurrentItem 세트 안에 있습니까? – user3735822

답변

0

솔직히 말해서, 그 방법 중 하나입니다. 우리가 new TabItem()를 추가하고 해당 탭 지수와 헤더를 제공하고 있습니다

private void Button1_Click(object sender, RoutedEventArgs e) 
    { 
     TabControl1.Items.Add(new TabItem() { TabIndex = 0, Header = "Tab 0" }); 
     TabControl1.Items.Add(new TabItem() { TabIndex = 1, Header = "Tab 1" }); 
     TabControl1.Items.Add(new TabItem() { TabIndex = 2, Header = "Tab 2" }); 
     TabControl1.Items.Add(new TabItem() { TabIndex = 3, Header = "Tab 3" }); 
    } 

주의 : 여기에 더 나은 해결책이 될 수 있습니다. 이 접근 방법을 사용하면 훨씬 더 역동적이고 훨씬 더 신뢰할 수 있습니다.

따라서, 귀하의 예제에서, 당신은 같은 것을 할 수 있습니다

 if (pv != null) 
     { 
      if (index == -1) 
      { 
       TabList.Add(new TabItem() { TabIndex = <EnumeratedValue>, Header = "Tab " + <EnumeratedValue>.ToString()}); 
      } 
     } 
+0

OP가 'CurrentItem'을 바인딩하는 방식 때문에 사용할 가능성이있는 MVVM 접근 방식을 사용하는 경우이 방법은 더 나은 솔루션이 아닙니다. 또한, 'TabIndex'는 탭의 색인이 아니며 (다른 주석 기자가 이미 지정한 것처럼) 사용자가 탭을 통과 할 때 사용되는 컨트롤의 순서입니다. 탭에 사용할 수있는 색인이 없으며 상위 컨테이너는 선택된 항목 ('SelectedIndex') iirc의 색인을 갖습니다. – Charleh

+0

맞고 다른 사람들도 똑같은 말을하고 있습니다. 동적으로 탭을 추가하고 제거하는 경우 tabindex를 사용하지 않는 이유는 무엇입니까? 최종 사용자가 탭을 통해 탭하려고하는 경우 주문은 항상 잘 정의됩니다. –

+0

WPF/SL이 페이지의 컨트롤 위치를 기반으로 탭 인덱스를 자동으로 설정하기 때문입니다.심각한 문제가 있거나 직관적이지 않은 순서로 설정하려는 경우가 아니면 명시 적으로 설정할 필요가 없습니다. – Charleh