2013-07-01 127 views
2

全部,如何以編程方式更改WPF TabControl中的選項卡名稱?

我在這裏搜索了廣泛的解決方案,但我有一種感覺,我的問題源於對WPF的基本知識缺乏。我對它很陌生,迄今爲止已經被黑客攻擊並儘可能使用Google搜索。

基本上,我有一個功能區與TabControl動態交互。功能區選項卡選擇一個項目類別,RibbonGroups中的MenuItems然後選擇類別內的項目。在單擊某個項目時,TabControl上的選項卡需要動態更改。無論是隻是標題,標籤本身,還是整個TabControl都適合我。到目前爲止,單擊RibbonGroups內部的MenuItem時,我試圖將TabControl上的每個選項卡的標題文本設置爲「blah」。然後Header對象拋出一個空指針。無論我設置Header,Tabs還是TabControl本身,都會發生這種情況。

爲什麼?!?!?!?

...以及如何在世界上我解決它?

謝謝!

+2

您可以發佈您正在使用的代碼來嘗試設置標題文本嗎? –

+0

GUI是.xaml.cs類和optionTabs是列表

 foreach (TabItem tab in GUI.optionTabs) { tab.Header = "blah"; }  
unwrittenrainbow

回答

5

WPF設計時考慮到數據/ UI分離。你無法找到解決方案的原因之一是你試圖做的是一個不行的;而不是以編程方式更改UI的標題文本,而應改爲更改底層數據,並允許WPF管道更新數據的顯示方式。

WPF選項卡控件可以字面上包含的任何類型的對象;你可以用整數或字符串或FooBars或其他來填充它。無法保證這些對象中的任何一個都會定義Header屬性,並且由開發人員來配置數據綁定或模板,以指示TabControl如何顯示FooBar或其他內容。

在符合MVVM設計模式的理想WPF應用程序中,您可能會將TabControl綁定到視圖模型集合,每個視圖模型集合都定義一個HeaderText屬性。您的視圖模型將實現INotifyPropertyChanged接口,以便在視圖模型上更改HeaderText屬性時,UI將得到更新。儘管如此,如果你有一個現有的應用程序,使用不同的設計模式從頭開始重寫它可能是不現實的,並且MVVM不容易添加到現有的代碼庫中。如果您正在使用簡單的Designer生成的UI,而不使用任何數據綁定,那麼以下代碼將完成您所要求的操作。有時。

foreach(TabItem item in tabControl.Items) 
    item.Header = "blah"; 

...但正如我之前說的,誰也不能保證,一個WPF的TabControl的項目集合將包含類型的TabItem的項目,所以這段代碼是不是安全。

+0

我的直覺,我從根本上缺少的東西是正確的然後。這個應用程序是一個大型企業軟件的小插件。我控制整個開發/設計/ GUI,它幾乎完成。因此,重做這一切將會很簡單。謝謝! :) – unwrittenrainbow

1

雖然RogerN的答案也許是一個更好的答案,這裏是改變一個選項卡上顯示的文本代碼示例:

XAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <TabControl Name="MyTabControl"> 
     <TabItem Header="Tab One"> 
      <TextBlock Text="This is tab #1." /> 
     </TabItem> 
     <TabItem Header="Tab Two"> 
      <TextBlock Text="This is tab #2." /> 
     </TabItem> 
     <TabItem Header="Tab Three"> 
      <TextBlock Text="This is tab #3." /> 
     </TabItem> 
    </TabControl> 
    <Button Grid.Row="1" Content="Change Tab" Name="ChangeButton" Click="ChangeButton_Click" /> 
</Grid> 

後面的代碼:

public partial class MainWindow : Window { 

    public MainWindow() { 
     InitializeComponent(); 
    } 

    private void ChangeButton_Click(object sender, RoutedEventArgs e) { 
     ((TabItem)MyTabControl.Items[0]).Header = "Changed!"; 
    } 
} 
0

嘗試將其綁定到代碼列表中,如下所示:

private List<TabItem> TabItems = new List<TabItem>() 
{ 
    "Item1", 
    "Item2", 
    "Item3" 
}; 

tabcontrol1.ItemSource = TabItems; 

然後在您想要更改tabcontrol中的項目時重新綁定它。這樣您可以動態更改名稱並添加更多選項卡項目。在這樣做時,您必須使用TabItem.Content屬性以編程方式添加控件。

相關問題