4

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

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

  1. 用户右键单击TreeViewItem
  2. AcontextMenu下降(完成)
  3. 用户单击“重命名...”并打开一个窗口(完成)
  4. 姓名TreeViewItem输入textBox(DONE)
  5. 如果 中的文本与mainWindow 中的textBoxa 匹配,则会打开另一个窗口,允许用户输入 的新名称。(未完成)headerTreeViewTreeViewItem
  6. 在新窗口中输入名称后,用户单击回车,项目的名称将更改为在textBox. (未完成)

这是我的第 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 步,我了解如何添加一个TreeViewItem动态创建的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;
           }
       }
}
4

1 回答 1

0

设置标题很简单:

treeViewItem.Header = textBox1.Text;

查找它应该类似于查找是否有任何TreeViewItem.Header匹配中提供的文本TextBox

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);
    }
}

更新>>>

您可以使用此方法检查项目标题...如果它返回 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);
于 2013-07-29T15:11:51.463 回答