如何根据它的标题选择一个TabItem

时间:2013-08-21 15:32:25

标签: c# wpf treeview tabcontrol

在我的计划中,当tabItem选择等效TreeViewItem时,我会选择header

这就是我现在拥有的(它有效):

(parent_TreeViewItem.Items.Contains(SelectedItem))
{
          tabControl1.SelectedItem = tabControl1.Items //Changes tab according to TreeView
                .OfType<TabItem>().SingleOrDefault(n => n.Header.ToString() == SelectedItem.Header.ToString());
}

与我现在所做的不同的是,我选择的tabItem headerstringinteger组成。

例如:所选的TreeViewItem始终会有一个名为header的{​​{1}},但"Arrival"的{​​{1}}会有tabItem这样的形式1}}。 header值将来自父节点的"Arrival" + integer

对于这个过程,我认为我首先需要得到父节点的integer值,因为它包含我需要的header值。然后,我需要在某种程度上修改上面的代码,以查询header类似integer的节点。

我该怎么做?

谢谢。

更新

我目前的代码,使用@ varocarbas的答案。我使用的是答案的第一个版本,其中涉及将header "Arrival" + parentHeader设置为父integer的值。单击“到达”节点时,代码会编译但不执行任何操作。

curNumber

UPDATE 2:因为“Arrival”节点是我用作父节点的节点的孙子,所以我将第一行中的header语句更改为:

if (parent_TreeViewItem.Items.Contains(SelectedItem.Parent)) //Location - Actions tabs
{
       TreeViewItem parentItem = (TreeViewItem)SelectedItem.Parent;
       int curNumber = getNumber(parentItem.Header.ToString());

       tabControl1.SelectedItem = tabControl1.Items //Changes tab according to TreeView
             .OfType<TabItem>().SingleOrDefault(n => n.Header.ToString() == SelectedItem.Header.ToString() + curNumber.ToString());
}

public static int getNumber(string parentNodeHeader)
{
    int curNumber = 0;
    curNumber = Convert.ToInt32(parentNodeHeader);

    return curNumber;
}

1 个答案:

答案 0 :(得分:1)

首先,您必须获取父节点及其标题中包含的数字:

TreeViewItem parentItem = (TreeViewItem)selectedItem.Parent;
int curNumber = getNumber(parentItem.Header.ToString());

getNumber是一个从父节点头中的确切位置检索数字的函数。为了写出一个合适的函数,你必须告诉它更多。暂时,只是基础知识(它提取输入字符串中的所有数字):

private int getNumber(string parentNodeHeader)
{
    int curNumber = 0;

    //Required string-analysis actions
    //Sample functionality: extract all the numbers in the given string
    string outString = "";
    int count = -1;
    do
    {
        count = count + 1;
        Char curChar = Convert.ToChar(parentNodeHeader.Substring(count, 1));
        if (Char.IsNumber(curChar))
        {
            outString = outString + parentNodeHeader.Substring(count, 1);
        }
    } while (count < parentNodeHeader.Length - 1);

    if (outString != "")
    {
        curNumber = Convert.ToInt32(outString);
    }

    return curNumber;
}

然后您必须更新查询以考虑新信息:

 .OfType<TabItem>().SingleOrDefault(n => n.Header.ToString() == selectedItem.Header.ToString() + curNumber.ToString());

更新

上面的函数只显示了我通常依赖的代码类型;但是对于简单的情况(比如建议在字符串中获取所有数字),您可能更愿意依赖于Regex,如Viv所建议的那样。您可能会依赖以下内容:

private int getNumber(string parentNodeHeader)
{
    System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(parentNodeHeader, @"\d+");
    return Convert.ToInt32(m.Value);
}

此功能仅提供它找到的第一组连续数字;与上述功能不同的结果,但足以作为概念证明(这个答案的意图)。