如何在WPF TabControl中以编程方式更改选项卡名称?

3

大家好,

我在这里进行了广泛的搜索,但我觉得我的问题源于对 WPF 缺乏基本的知识。我是新手,并且到目前为止一直在尽力通过黑客和谷歌来解决问题。

基本上,我有一个与 TabControl 动态交互的 Ribbon。选项卡选择项目类别,RibbonGroups 中的菜单项选择类别中的项目。单击项目后,TabControl 上的选项卡需要动态更改。无论是仅标题、选项卡本身还是整个 TabControl 都可以。到目前为止,在 RibbonGroups 内部单击 MenuItem 时,我尝试仅将每个 TabControl 上的选项卡标题文本设置为“blah”。然后,Header 对象抛出 null 指针异常。无论是设置 Header 还是 Tabs 还是 TabControl 本身,都会发生这种情况。

为什么?????

……我该如何修复它?

谢谢!


2
你能否发布一下你目前正在使用的代码,尝试设置标题文本? - Daniel Simpkins
GUI 是 .xaml.cs 类,optionTabs 是一个 List<TabItem>。foreach (TabItem tab in GUI.optionTabs) { tab.Header = "blah"; } - unwrittenrainbow
3个回答

5
WPF旨在实现数据和UI分离。你找不到解决方案的原因之一是你试图做的是行不通的;你应该改变底层数据而不是以编程方式更改UI的页眉文本,然后允许WPF管道更新数据的显示方式。
WPF选项卡控件可以包含任何类型的对象,例如整数、字符串或FooBars等。无法保证这些对象中的任何一个都定义了Header属性,开发人员需要配置数据绑定或模板,以指示TabControl如何显示FooBar或其他内容。
在遵循MVVM设计模式的理想WPF应用程序中,您可能会将TabControl绑定到视图模型集合,每个视图模型都定义了HeaderText属性。您的视图模型将实现INotifyPropertyChanged接口,以便当视图模型上的HeaderText属性更改时,UI将得到更新。
尽管如此,如果您有现有的应用程序,则从头开始使用不同的设计模式重写它可能是不现实的,并且MVVM不容易添加到现有的代码库中。如果您正在使用简单的设计器生成的UI而没有使用任何数据绑定,则以下代码可以实现您的要求。但有时候不可行。
foreach(TabItem item in tabControl.Items)
    item.Header = "blah";

... 但是正如我之前所说的,不能保证 WPF TabControl 的 Items 集合只包含 TabItem 类型的项,因此这段代码不安全。


我的直觉是我基本上漏掉了什么东西,这是正确的。这个应用程序是一个庞大的企业软件的小插件。我控制整个开发/设计/图形用户界面,它几乎完成了。因此,重新做一切将会很简单。谢谢!:) - 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;

然后,您可以在任何时候重新绑定它以更改选项卡控件中的项目。这样,您就可以动态更改名称并添加更多选项卡项目。在此过程中,您将不得不使用TabItem.Content属性以编程方式添加控件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接