根据标题删除标签项

时间:2013-08-16 20:43:28

标签: c# wpf header tabitem

首先,这个问题是对this question的跟进。我觉得我只回答了一半的问题。

除了删除tabItems引用的Name之外,我还需要通过引用他们的tabItems来删除Headers

在实施我的回答并将n.Name更改为n.Header时,如下所示:

var tabToDelete = tabControl.Items.OfType<TabItem>().SingleOrDefault(n => n.Header == stringValue);
if (tabToDelete != null) 
tabControl.Items.Remove(tabToDelete);

我发现它不起作用。这应该工作,还是我需要编辑整个结构?如果是这样,我该怎么做才能确保tabItem引用我需要的Header

添加:当Name引用的标签被删除时,它们将从屏幕上删除,而Header引用的标签不会被删除(直到您手动切换标签)。这让我觉得它们仍然存在于该计划中。

2 个答案:

答案 0 :(得分:1)

您的问题是Header是一个对象,而不是一个字符串。您将两个值进行比较,就好像它们一样,但是因为Header是一个对象,您实际上在进行参考比较,而不是值比较。您只需在Header上调用.ToString()即可将Header投射到字符串。

var tabToDelete = tabControl.Items.OfType<TabItem>().SingleOrDefault(n => (n.Header as string) == stringValue);
if (tabToDelete != null)
    tabControl.Items.Remove(tabToDelete);

如果这不能解决问题,您可以通过调用

强制控件重绘
tabControl.Refresh();

更新

感谢Daniel Gimenez发现可能的空引用异常。然而,Header被设置为控件的问题不是问题,因为所有对象都可以调用ToString(),真正的问题是如果Header根本没有设置,导致一个null对象。

答案 1 :(得分:1)

像Ryan所说,问题是Header可以是控件而不仅仅是文本。如果Header可以是null,则as StringConvert.ToString()将优于toString(),因为它们都可以处理从空值转换而ToString()生成例外。

使用Convert.ToString()可能过度,但如果您的Headers绑定到无法隐式转换为字符串的值(例如整数),则使用Convert.ToString()将能够处理它们。如果存在具有相同标题值的多个项目,此解决方案也将处理该情况。

private void RemoveTabByHeader(string str) 
{
    TabsMain.Items.OfType<TabItem>().Where(t => Convert.ToString(t.Header) == str)
       .ToList().ForEach(t => TabsMain.Items.Remove(t));
}

这是经过测试的。 TabControl正确更新。