首页 文章

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

提问于
浏览
2

所有,

我已经在这里广泛搜索了解决方案,但我感觉我的问题源于对WPF的基本缺乏知识 . 我是新手,到目前为止我已经黑了,并且尽我所能用Google搜索 .

基本上,我有一个Ribbon与TabControl动态交互 . 功能区选项卡选择项目类别,RibbonGroups中的MenuItems然后选择类别中的项目 . 单击项目后,TabControl上的选项卡需要动态更改 . 无论是 Headers ,标签本身,还是整个TabControl都可以 . 到目前为止,在单击一个RibbonGroups内部的MenuItem时,我尝试只为TabControl上的每个选项卡设置Header文本等于“blah” . 然后Header对象抛出一个空指针 . 无论我是设置Header,Tabs还是TabControl本身,都会发生这种情况 .

为什么?!?!?!?

......以及我如何解决它?

谢谢!

3 回答

  • 5

    WPF在设计时考虑了数据/ UI分离 . 您找不到解决方案的原因之一是因为您要做的事情是禁止的;而不是以编程方式更改UI的 Headers 文本,您应该改变基础数据,并允许WPF管道更新数据的显示方式 .

    WPF选项卡控件可以包含任何类型的对象;你可以用整数或字符串或FooBars或其他任何东西填充它 . 开发人员需要配置数据绑定或模板,以指示TabControl如何显示FooBar或其他任何东西 .

    在符合MVVM设计模式的理想WPF应用程序中,您可能将TabControl绑定到视图模型的集合,每个视图模型定义一个HeaderText属性 . 您的视图模型将实现INotifyPropertyChanged接口,以便在视图模型上更改HeaderText属性时,UI将更新 .

    说了这么多,如果你有一个现有的应用程序,使用不同的设计模式从头开始重写它可能是不现实的,并且MVVM不容易添加到现有的代码库中 . 如果您使用简单的Designer生成的UI而不使用任何数据绑定,那么以下代码可以满足您的要求 . 有时 .

    foreach(TabItem item in tabControl.Items)
        item.Header = "blah";
    

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

  • 0

    虽然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!";
        }
    }
    
  • 1

    尝试将其绑定到代码中的列表,如下所示:

    private List<TabItem> TabItems = new List<TabItem>()
    {
        "Item1",
        "Item2",
        "Item3"
    };
    
    tabcontrol1.ItemSource = TabItems;
    

    然后在您想要更改tabcontrol中的项目时重新绑定它 . 这样,您可以动态更改名称并添加更多选项卡项 . 在执行此操作时,您必须使用TabItem.Content属性以编程方式添加控件 .

相关问题