2013-07-25 82 views
2

我以編程方式創建WPF TabItem並將其添加到我的TabControl。以編程方式添加和編輯控件

var tabItem = new TabItem { Header = "foo" }; 

現在我要像做

var txt1 = new TextBlock { Text = "foo" }; 
    var txt2 = new TextBlock { Text = "bar" }; 

    var tabItem = new TabItem { Header = txt1 + txt2 }; // cannot apply operator + to TextBlock and TextBlock 
    // Other Idea: 
    // var tabItem = new TabItem { Header = new TextBlock { Text = "foo" }.Text + new TextBlock { Name = "txt2", Text = "bar" }}; 
    // Maybe I could edit my TextBlock via it's name? 
    ... 
    txt2.Text = "editedBar"; // have to update the header of tabItem. 

這是可能的呢?我知道在XAML這不會是一個問題。但現有的架構迫使我嘗試這種方式。

+0

爲了澄清,當'txt2.Text =「editedBar」;'運行時,頭應該更新爲'fooeditedBar'? –

+0

這是正確的。 – Lucas

+1

我無法想象一個「現有架構」,您無法創建適當的UserControl或其他XAML定義的UI(這是正確的方式),然後在任何情況下將其添加到現有的程序中。 –

回答

1

我會做這樣的事情:

StackPanel panel = new StackPanel(); 
panel.Children.Add(txt1); 
panel.Children.Add(txt2); 

var tabItem = new TabItem { Header = panel }; 
+0

這對我有用。但是我必須每次都設置標題。 'tabItem.Header = stackPanel'。 'txt2 =「foo」'不夠。 – Lucas

+0

無需每次都設置標題。您應該像這樣訪問TextBlocks((TextBlock)(StackPanel)tabItem.Header).Children [0])。Text =「foo」;這是一個有點忙:( –

0

的任擇議定書要求的的程序化的方式來創建WPF TabItems並添加到TabControl,通過UserControls的增加,但如果你有一個ListCollection您的對象,您可以將它們綁定到TabControl.ItemsSource,然後使用DataTemplates指定ItemTemplateContentTemplate

TabControl的XAML:

<TabControl ItemsSource="{Binding MyItems}"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding StringFormat="{} {0}{1}"> 
        <Binding Path="HeaderA"/> 
        <Binding Path="HeaderB"/> 
       </MultiBinding> 
      </TextBlock.Text> 
      </TextBlock> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
     <TextBlock> 
      <TextBlock.Text> 
      <Binding Path="MyContent"/> 
      </TextBlock.Text> 
     </TextBlock> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

MyItem類被用於TabControl的

名單 MyItem的
public class MyItem { 
    public string HeaderA { get; set; } 
    public string HeaderB { get; set; } 
    public string MyContent { get; set; } 
} 

對象

public List<MyItem> MyItems { 
    get { 
     return new List<MyItem>() { 
      new MyItem() { 
       HeaderA = "Foo0", 
       HeaderB = "Bar0", 
       MyContent = "This is content." 
      }, 
      new MyItem() { 
       HeaderA = "Foo1", 
       HeaderB = "Bar1", 
       MyContent = "This is content."} 
      }; 
     } 
    } 
} 

這種方式,你可以改變我的內容轉換爲object類,然後使用DataTemplatesDataType屬性指定在ContentTemplate中顯示的內容,如果它們具有不同的內容對象。

相關問題