3

全部,

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

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

为什么?!?!?!?

...我到底该如何修复它???

谢谢!

4

3 回答 3

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";

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

于 2013-07-01T20:08:24.270 回答
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!";
    }
}
于 2013-07-01T20:14:24.750 回答
0

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

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

tabcontrol1.ItemSource = TabItems;

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

于 2013-07-01T20:49:21.460 回答