首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何刷新基于vscode.TreeDataProvider的TreeView?

如何刷新基于vscode.TreeDataProvider的TreeView?
EN

Stack Overflow用户
提问于 2022-05-20 00:04:55
回答 2查看 279关注 0票数 2

首先填充TreeView并实例化TreeView。“刷新”按钮调用自定义刷新函数来收集更新的数据。这个新信息存储在context.globalState()中

ctmInfrastructureProvider.refresh();不更新TreeView。我还添加了事件侦听器。

代码语言:javascript
运行
复制
export class CtmInfrastructureProvider implements vscode.TreeDataProvider<number> {

    private _onDidChangeTreeData: vscode.EventEmitter<number | null> = new vscode.EventEmitter<number | null>();
    readonly onDidChangeTreeData: vscode.Event<number | null> = this._onDidChangeTreeData.event;
.
.
.
    constructor(private context: vscode.ExtensionContext) {
        let ctmInfrastructureCacheTmp: any = context.globalState.get('ctmInfrastructureCache');
        this.refresh();
    }
.
.
.
}

以下是我的刷新功能:

代码语言:javascript
运行
复制
let ctmInfrastructureRefreshEntry = vscode.commands.registerCommand(
        'ctm.infrastructure.refreshEntry',
        async () => {           
ctmInfrastructureDicsovery = discoverCtmInfrastructure();                     context.globalState.update('ctmInfrastructureCache',JSON.parse(ctmInfrastructureDicsovery));
ctmInfrastructureProvider.refresh();
        }
    );
    context.subscriptions.push(ctmInfrastructureRefreshEntry);

TreeDataProvider刷新()

代码语言:javascript
运行
复制
    refresh(offset?: number): void {
            this.parseTree();
    }
代码语言:javascript
运行
复制
    private parseTree(): void {
        this.text = this.ctmInfrastructureCache;
        this.tree = json.parseTree(this.ctmInfrastructureCache);
    }

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-20 07:23:41

您必须触发更改事件:

代码语言:javascript
运行
复制
    refresh(offset?: number): void {
            this.parseTree();
        this._onDidChangeTreeData.fire();
    }

更新

实际上,我使用了一种与树演示略有不同的方法:

代码语言:javascript
运行
复制
import { TreeDataProvider, TreeItem, EventEmitter, TextDocument, ProviderResult, Event } from "vscode";
import { AntlrFacade } from "../backend/facade";

export class AntlrTreeDataProvider<T> implements TreeDataProvider<T> {
    protected currentFile: string | undefined;

    private changeEvent = new EventEmitter<void>();

    public constructor(protected backend: AntlrFacade) { }

    public get onDidChangeTreeData(): Event<void> {
        return this.changeEvent.event;
    }

    public refresh(document: TextDocument | undefined): void {
        if (document && document.languageId === "antlr" && document.uri.scheme === "file") {
            this.currentFile = document.fileName;
        } else {
            this.currentFile = undefined;
        }
        this.changeEvent.fire();
    }

    public getTreeItem(element: T): TreeItem {
        return element;
    }

    public getChildren(_element?: T): ProviderResult<T[]> {
        return undefined;
    }
}

摘自我的VS代码扩展:https://github.com/mike-lischke/vscode-antlr4/blob/master/src/frontend/AntlrTreeDataProvider.ts。如您所见,我使用EventEmitter代替,它不需要fire()事件的参数。

票数 0
EN

Stack Overflow用户

发布于 2022-05-23 01:17:41

如果函数正在提供新数据,则刷新工作。示例:

代码语言:javascript
运行
复制
    refresh(offset?: number, context?: vscode.ExtensionContext): void {
        this.ctmInfrastructureCache = "some data";
        this.parseTree();
        if (offset) {
            this._onDidChangeTreeData.fire(offset);
        } else {
            this._onDidChangeTreeData.fire(undefined);
        }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72312235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档