如何重命名动态创建的TreeView项的标头

时间:2013-07-29 14:46:56

标签: c# wpf treeview

我是WPF中的TreeView新手:C#,我正在学习如何使用动态创建的TreeViewItems。现在,我的程序允许用户创建动态TreeViewItems,然后删除它们。对于我的下一步,我想编写重命名这些动态项的功能。从理论上讲,这个过程非常自我解释,但是,我不知道如何处理C#代码。

首先,我想概述一下我的重命名过程,以准确显示我需要帮助的地方。

  1. 用户右键单击TreeViewItem
  2. A contextMenu下降(DONE)
  3. 用户点击“重命名...”并打开一个窗口(完成)
  4. TreeViewItem的姓名已输入textBox(已完成)
  5. 如果textBox中的文字与mainWindow header中的TreeView匹配,则会打开另一个窗口,允许用户输入TreeViewItem的新名称。 (不完全的)
  6. 在新窗口中输入名称后,用户单击“输入”,项目名称将更改为textBox中输入的内容。 (不完全的)
  7. 以下是我的第5步的代码,其中程序需要验证header中是否存在TreeView输入的内容。在我不确定正确代码的区域,我有伪代码。

    //ENTER - Select TreeViewItem, open enterName window
    private void button2_Click(object sender, RoutedEventArgs e)
    {
           //Query for Window1
           var mainWindow = Application.Current.Windows
               .Cast<Window1>()
               .FirstOrDefault(window => window is Window1) as Window1;
    
           //If(textbox1.text == one of the treeViewItem headers)
           var newWindow = new EnterCartName();
           newWindow.Show();
    
           //else,
           //MessageBox.Show("Value entered does not match a current cart name");
           //this.Close();
    }
    

    对于第6步,我了解如何使用动态创建的TreeViewItemadd header,但我不确定如何获取和重命名现有的//ENTER - Change cart name private void button2_Click(object sender, RoutedEventArgs e) { this.Close(); //close Window //Query for Window1 var mainWindow = Application.Current.Windows .Cast<Window1>() .FirstOrDefault(window => window is Window1) as Window1; //mainWindow.treeViewItem.Header(TVI gotten from previous window) = textBox1.Text; } 。这是我的代码:

    TreeView

    我认为动态//Now Global bool hasFoundMatch; //ENTER - Select cart, open enter name window private void button2_Click(object sender, RoutedEventArgs e) { string input, output; //Query for Window1 var mainWindow = Application.Current.Windows .Cast<Window1>() .FirstOrDefault(window => window is Window1) as Window1; //Get TreeViewItem from mainWindow TreeViewItem renameCart = mainWindow.cartTypes_TI; input = textBox1.Text; output = textBox2.Text; //Check if header exists hasFoundMatch = CheckItemHeader(renameCart.Items, input); //if header exists - set new header //Else - show message box if (hasFoundMatch == true) SetItemHeader(renameCart.Items, input, output); else MessageBox.Show("Value entered does not match a current cart name."); //close window this.Close(); } //Checks to see whether the user entered header exists private bool CheckItemHeader(ItemCollection treeViewItems, string input) { bool hasFoundMatch = false; for (int index = 0; index < treeViewItems.Count; index++) { TreeViewItem item = (TreeViewItem)treeViewItems[index]; string header = item.Header.ToString(); if(header == input) { hasFoundMatch = true; break; } else hasFoundMatch = false; } return hasFoundMatch; } //Changes the selected TVI header private void SetItemHeader(ItemCollection treeViewItems, string input, string output) { for (int index = 0; index < treeViewItems.Count; index++) { TreeViewItem item = (TreeViewItem)treeViewItems[index]; string header = item.Header.ToString(); if (header == input) { item.Header = output; break; } } } 资产的主要问题是我觉得它们对我来说是不可见的。如果我不知道他们叫什么,或者如何正确引用它们,我该如何与他们合作。如果您知道有关此主题的任何指南或资源,请随时分享。

    非常感谢。

    我的最终解决方案:

    {{1}}

1 个答案:

答案 0 :(得分:0)

设置标题非常简单:

treeViewItem.Header = textBox1.Text;

查找它应该类似于查找是否有TreeViewItem.HeaderTextBox中提供的文字匹配:

private void SetItemHeader(ItemCollection treeViewItems, string input, string output)
{
    for (int index = 0; index < treeViewItems.Count; index++)
    {
        TreeViewItem item = (TreeViewItem)treeViewItems[index];
        if (item.Header == input)
        {
            item.Header = output;
            return;
        }
        else if (item.Items.Count > 1) SetItemHeader(item.Items, input, output);
    }
}

更新&gt;&gt;&gt;

您可以使用此方法检查项目标题...如果它返回true,则表示您匹配:

private bool CheckItemHeader(ItemCollection treeViewItems, string input)
{
    for (int index = 0; index < treeViewItems.Count; index++)
    {
        TreeViewItem item = (TreeViewItem)treeViewItems[index];
        if (item.Header == input) return true;
        else if (item.Items.Count > 1) return CheckItemHeader(item.Items, input);
    }
    return false;
}

您可以使用它:

bool hasFoundMatch = CheckItemHeader(treeView.Items, textInputToMatch);

然后,当您有值将标题更改为:

SetItemHeader(treeView.Items, textInputToMatch, textToChangeHeaderTo);