private void treeView_AfterLabelEdit(object sender, VirtualNodeLabelEditEventArgs e) { VirtualTreeNode node = e.Node; treeView.LabelEdit = false; Folder folder = e.Node.Tag as Folder; GroupingTag groupingTag = e.Node.Tag as GroupingTag; Command command = null; object newTag = null; EventHandler <RenameCompletedEventArgs> completed = delegate(object s, RenameCompletedEventArgs ee) { Program.Invoke(this, delegate { ResumeRefreshTreeView(); if (ee.Success) { // the new tag is updated on the node here. This ensures that the node stays selected // when the treeview is refreshed. If you don't set the tag like this, the treeview refresh code notices // that the tags are different and selects the parent node instead of this node. // if the command fails for some reason, the refresh code will correctly revert the tag back to the original. node.Tag = newTag; RefreshTreeView(); // since the selected node doesn't actually change, then a selectionsChanged message doesn't get fired // and the selection doesn't get updated to be the new tag/folder. Do it manually here instead. treeView_SelectionsChanged(treeView, EventArgs.Empty); } }); }; if (!string.IsNullOrEmpty(e.Label)) { if (folder != null) { RenameFolderCommand cmd = new RenameFolderCommand(Program.MainWindow, folder, e.Label); command = cmd; cmd.Completed += completed; newTag = new Folder(null, e.Label); } else if (groupingTag != null) { RenameTagCommand cmd = new RenameTagCommand(Program.MainWindow, groupingTag.Group.ToString(), e.Label); command = cmd; cmd.Completed += completed; newTag = new GroupingTag(groupingTag.Grouping, groupingTag.Parent, e.Label); } } if (command != null && command.CanExecute()) { command.Execute(); } else { ResumeRefreshTreeView(); e.CancelEdit = true; } }
private void treeView_AfterLabelEdit(object sender, VirtualNodeLabelEditEventArgs e) { VirtualTreeNode node = e.Node; treeView.LabelEdit = false; Folder folder = e.Node.Tag as Folder; GroupingTag groupingTag = e.Node.Tag as GroupingTag; Command command = null; object newTag = null; EventHandler<RenameCompletedEventArgs> completed = delegate(object s, RenameCompletedEventArgs ee) { Program.Invoke(this, delegate { ResumeRefreshTreeView(); if (ee.Success) { // the new tag is updated on the node here. This ensures that the node stays selected // when the treeview is refreshed. If you don't set the tag like this, the treeview refresh code notices // that the tags are different and selects the parent node instead of this node. // if the command fails for some reason, the refresh code will correctly revert the tag back to the original. node.Tag = newTag; RefreshTreeView(); // since the selected node doesn't actually change, then a selectionsChanged message doesn't get fired // and the selection doesn't get updated to be the new tag/folder. Do it manually here instead. treeView_SelectionsChanged(treeView, EventArgs.Empty); } }); }; if (!string.IsNullOrEmpty(e.Label)) { if (folder != null) { RenameFolderCommand cmd = new RenameFolderCommand(Program.MainWindow, folder, e.Label); command = cmd; cmd.Completed += completed; newTag = new Folder(null, e.Label); } else if (groupingTag != null) { RenameTagCommand cmd = new RenameTagCommand(Program.MainWindow, groupingTag.Group.ToString(), e.Label); command = cmd; cmd.Completed += completed; newTag = new GroupingTag(groupingTag.Grouping, groupingTag.Parent, e.Label); } } if (command != null && command.CanExecute()) { command.Execute(); } else { ResumeRefreshTreeView(); e.CancelEdit = true; } }