2014-09-04 64 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}"/> 

在視圖模型我有:

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"); 
     } 
    } 

但這種標籤列表(以XAML)是動態生成這樣:

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中。

問題是當我點擊CurrentItem(動態創建的TabItems(TabList)的數量),然後它給了很大的奇怪地址(如222557456)。

我的方式獲取當前項目的索引是錯誤的嗎? (int index = currentItem.TabIndex;)?

+1

'TabIndex'是*不*標籤的指數 - 它的存在訂購控件,而對照組之間按TAB鍵循環。 – Luaan 2014-09-04 16:16:54

+1

** TabIndex **並不表示TabControl中的項目索引。由於您有ViewModel List,** SelectedItem **可能不會返回TabItem,它應該引用綁定到當前TabItem的ViewModel。所以您可以試試這個** TabList.IndexOf(CurrentItem)**來代替。 – Claw 2014-09-05 02:47:43

+0

@Luaan所以如何在這裏做解決方案,以瞭解當前項目單擊的內容在CurrentItem集合內? – user3735822 2014-09-05 09:40:42

回答

0

說實話,這是做到這一點的一種方式。這可能是一個更好的解決方案:

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" }); 
    } 

請注意,我們正在增加new TabItem()並提供它與它的標籤指數和標頭。使用這種方法更加動態和可靠。

所以,在你的榜樣,你可能會做這樣的事情:

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

如果您使用OP可能使用的MVVM方法,由於它們綁定了'CurrentItem',這不是一個更好的解決方案。此外,「TabIndex」不是選項卡的索引(正如其他評論者已經指定的那樣),而是用戶在選中時使用的控件的順序。在選項卡上沒有可用索引,父容器具有所選項目('SelectedIndex')iirc的索引。 – Charleh 2014-09-05 11:59:21

+0

正確,其他人也在發表同樣的評論。雖然如果您要動態添加和刪除選項卡,爲什麼不使用tabindex?如果最終用戶希望通過選項卡進行選項卡製作,您的訂單將始終明確。 – 2014-09-05 12:06:28

+0

因爲WPF/SL會根據頁面上控件的位置自動設置標籤索引。你不需要明確地設置它,除非你有嚴重的問題,或者你想把它設置成一個不直觀的命令。 – Charleh 2014-09-05 12:08:06

相關問題