C# 以编程方式添加和编辑控件

C# 以编程方式添加和编辑控件,c#,wpf,C#,Wpf,我以编程方式创建了一个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

我以编程方式创建了一个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中这不会是一个问题。但是现有的体系结构迫使我这样做。

我会这样做:

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

var tabItem = new TabItem { Header = panel };

OP要求通过添加
UserControls
,以编程方式创建WPF
TabItems
并添加到
TabControl
,但如果您有对象的
列表或
集合
,您可以将它们绑定到
选项卡control.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对象列表

公共列表MyItems{
得到{
返回新列表(){
新建MyItem(){
HeaderA=“Foo0”,
HeaderB=“Bar0”,
MyContent=“这是内容。”
},
新建MyItem(){
HeaderA=“Foo1”,
HeaderB=“Bar1”,
MyContent=“这是内容。”}
};
}
}
}

通过这种方式,您可以将MyContent更改为
对象
类,然后使用
数据模板
数据类型
属性来指定如果您的内容有不同的对象,则在ContentTemplate中显示的内容。

澄清,当
txt2.Text=“editedBar”运行时,标题应更新为
fooeditedBar
?我无法想象“现有架构”无法创建正确的用户控件或XAML定义的UI(这是正确的方法),然后在任何情况下按程序将其添加到现有的内容中。
txt1
txt2
的这些值来自哪里?如果它们是同一范围内的两个属性,那么一个简单的解决方案是创建第三个将这两个属性结合起来的属性。(
public string MyProp{get{return Prop1+Prop2;}}}
)我很难想象这样一个场景:你想把它们像那样混在一起显示,尤其是在它们没有紧密联系的情况下。这对我很有效。但我每次都要设置标题
tabItem.Header=stackPanel
txt2=“foo”
还不够。没有必要每次都设置标题。您应该像这样访问文本块((TextBlock)(StackPanel)tabItem.Header).Children[0]).Text=“foo”;有点忙:(
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."}
            };
        }
    }
}