- I've registered a command for the tree element node
registerCommandWithTreeNodeUnwrapping('azureDatabases.refresh', refreshTreeElement);
export async function refreshTreeElement(
context: IActionContext,
node: AzExtTreeItem | TreeElementWithId,
): Promise<void> {
...
branchDataProvider.refresh(node); // calls refresh
...
}
Into BranchDataProvider I register each child in TreeElementStateManager
export class BranchDataProvider
extends vscode.Disposable
implements BranchDataProvider<CosmosDBResource, TreeElementWithId>
{
private readonly onDidChangeTreeDataEmitter = new vscode.EventEmitter<TreeElementWithId| undefined>();
constructor() {
super(() => this.onDidChangeTreeDataEmitter.dispose());
}
get onDidChangeTreeData(): vscode.Event<TreeElementWithId| undefined> {
return this.onDidChangeTreeDataEmitter.event;
}
async getChildren(element: TreeElementWithId): Promise<TreeElementWithId[]> {
try {
const result = await callWithTelemetryAndErrorHandling(
'',
async (context: IActionContext) => {
const children = (await element.getChildren?.()) ?? [];
return children.map((child) => {
return ext.state.wrapItemInStateHandling(child, (child: TreeElementWithId) =>
this.refresh(child),
) as TreeElementWithId; // THIS FUNCTION CREATES WRAPPED OBJECT with branchItem
});
},
);
return result ?? [];
} catch (error) {
}
}
async getResourceItem(resource: CosmosDBResource): Promise<TreeElementWithId> {
}
async getTreeItem(element: TreeElementWithId): Promise<vscode.TreeItem> {
return element.getTreeItem();
}
refresh(element?: TreeElementWithId): void {
this.onDidChangeTreeDataEmitter.fire(element);
}
}
- When I call a command
azureDatabases.refresh the method registerCommand tries to take contextValue. However, due to wrapped object which does not contain contextValue the getTreeItem() calls even if branchItem (real node instance) has this property

- Then the method
refreshTreeElement calls refreshing the node and getTreeItem calls again (twice)
Into
BranchDataProviderI register each child in TreeElementStateManagerazureDatabases.refreshthe methodregisterCommandtries to takecontextValue. However, due to wrapped object which does not containcontextValuethegetTreeItem()calls even if branchItem (real node instance) has this propertyrefreshTreeElementcalls refreshing the node andgetTreeItemcalls again (twice)