2013-07-25 2 views
2

Я создаю программно WPI 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 =" editBar ";' работает, заголовок должен обновляться до 'fooeditedBar'? –

+0

это правильно. – Lucas

+1

Я не могу представить себе «существующую архитектуру», где вы не можете создать надлежащий пользовательский интерфейс UserControl или иначе определенный им XAML (что является правильным способом сделать это), а затем в любом случае добавить это к существующему элементу процедурно. –

ответ

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, но если у вас есть List или Collection из ваши объекты, вы можете привязать их к TabControl.ItemsSource, затем используйте DataTemplates, чтобы указать ItemTemplate и ContentTemplate.

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

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

Список из MyItem объектов

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

Таким образом, вы можете изменить MyContent в класс object, затем используйте DataTemplates с атрибутом DataType, чтобы указать, что показывать в ContentTemplate, если у вас есть разные объекты для вашего контента.

Смежные вопросы