2

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

除了删除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不会(直到您手动切换选项卡)。这使我认为它们仍然存在于程序中。

4

2 回答 2

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对象。

于 2013-08-16T20:53:42.127 回答
1

就像 Ryan 说的那样,问题在于它Header可以是一个控件而不仅仅是文本。If Headercan be null, as Stringor Convert.ToString()will be 更好,toString()因为它们都可以处理从 null 值转换而ToString()产生异常。

使用Convert.ToString()可能有点矫枉过正,但如果您的标头绑定到无法隐式转换为字符串的值,例如整数,那么使用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正确更新。

于 2013-08-16T20:58:16.367 回答