首先,这个问题是对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
引用的标签不会被删除(直到您手动切换标签)。这让我觉得它们仍然存在于该计划中。
答案 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 String
或Convert.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
正确更新。