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

unw*_*bow 2 c# wpf tabcontrol ribbon

所有,

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

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

为什么?!?!?!?

......以及如何在世界上修复它?

谢谢!

Rog*_*erN 5

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

WPF选项卡控件可以包含任何类型的对象; 你可以用整数或字符串或FooBars或其他任何东西填充它.无法保证这些对象中的任何一个都将定义Header属性,并且由开发人员配置数据绑定或模板,这些数据绑定或模板指示TabControl如何显示FooBar或其他任何内容.

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

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

foreach(TabItem item in tabControl.Items)
    item.Header = "blah";
Run Code Online (Sandbox Code Playgroud)

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