C# 使用单个控件作为多个选项卡的内容

C# 使用单个控件作为多个选项卡的内容,c#,wpf,C#,Wpf,我有一个TextBox、一个TabControl和一个名为someobject的简单对象 我创建一个列表对象,并用动态编号的someobject填充它 对于该列表中的每个someobject,我创建了一个TabItem为其名称指定与该someobject中的name属性相同的值 下面是我正在做的一个注释代码 public partial class MainWindow : Window { List<SomeObject> list; TextBox textbo

我有一个
TextBox
、一个
TabControl
和一个名为
someobject
的简单对象

我创建一个
列表
对象,并用动态编号的
someobject
填充它

对于该列表中的每个
someobject
,我创建了一个
TabItem
为其名称指定与该
someobject
中的name属性相同的值

下面是我正在做的一个注释代码

public partial class MainWindow : Window
{

    List<SomeObject> list;
    TextBox textbox = new TextBox() { Name = "textbox1" };
    public MainWindow()
    {
        InitializeComponent();
        //create a test list of someobject
        list = new List<SomeObject>()
        {
            new SomeObject() {name = "Italian", description = "Italian description"},
            new SomeObject() {name = "German", description = "german description"},
            new SomeObject() {name = "French", description = "french description"}
        };

        //add a tab item for each object
        foreach(SomeObject someobj in list)
        {
            tabControl1.Items.Add(new TabItem { Name = someobj.name,Header = someobj.name });
        }

    }

    //on selected tabitem changed event set the content of all tab items to null and set the content of the selected tabitem to the TextBox textbox1
    private void tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        foreach(TabItem tab in (sender as TabControl).Items)
        {
            tab.Content = null;
        }
        string someobjectnameproperty = ((sender as TabControl).SelectedItem as TabItem).Name;
        textbox.Text = list.Find(obj => obj.name == someobjectnameproperty).description;
        ((sender as TabControl).SelectedItem as TabItem).Content = textbox;
    }

    //someobject class
    class SomeObject
    {
        public string name { get; set; }
        public string description { get; set; }
    }

}
公共部分类主窗口:窗口
{
名单;
TextBox TextBox=new TextBox(){Name=“textbox1”};
公共主窗口()
{
初始化组件();
//创建someobject的测试列表
列表=新列表()
{
新建SomeObject(){name=“意大利语”,description=“意大利语描述”},
新建SomeObject(){name=“German”,description=“German description”},
新建SomeObject(){name=“French”,description=“French description”}
};
//为每个对象添加选项卡项
foreach(列表中的SomeObject someobj)
{
tabControl1.Items.Add(新TabItem{Name=someobj.Name,Header=someobj.Name});
}
}
//在selected tabitem changed事件中,将所有选项卡项的内容设置为null,并将selected tabitem的内容设置为TextBox textbox1
私有无效选项卡控件1\u SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
foreach(TabItem tab in(发件人为TabControl).Items)
{
tab.Content=null;
}
字符串someobjectnameproperty=((发件人作为TabControl)。选择EdItem作为TabItem)。名称;
Text=list.Find(obj=>obj.name==someobjectnameproperty).description;
((发件人作为选项卡控件)。选择EdItem作为选项卡项)。内容=文本框;
}
//someobject类
类对象
{
公共字符串名称{get;set;}
公共字符串说明{get;set;}
}
}
我这么做是因为我不想在每个选项卡项中都有一个textbox控件,代码工作得很好,但是有没有更方便的方法来实现wpf的相同结果


这只是一个演示示例。

不要在过程代码中创建或操作UI元素。@HighCore为什么不给每个元素命名并知道如何获取它们?因为这是一种蹩脚的过程方法。学习MVVM。这是一个关于如何在WPF中处理
TabControl
的示例。Hi@user1492051,Highcore是对的,MVVM是解决这类问题的更好方法。您需要将TabControl的Items属性绑定到对象列表,这将自动导致WPF将每个项绘制为
TabItem
。然后可以使用
选项卡项
属性(如名称或标题)绑定到数据对象上的关联项。如果你感兴趣,我在我的博客上有一个,如果你刚刚开始使用MVVM,你可能会发现它也很有用。@Rachel谢谢你,这就是我想要的,只是我觉得用我的方式做不对