You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中如何将类值绑定到NavMenu.razor并实现实时更新?

解决Blazor静态字段更新后组件不实时刷新的问题

步骤1:修改静态类,添加更新通知事件

把原有静态类改成带事件触发的版本,确保字段值变化时能通知组件:

public static class ClassNumber
{
    private static int _txtnumber;
    public static int txtnumber
    {
        get => _txtnumber;
        set
        {
            _txtnumber = value;
            NumberChanged?.Invoke();
        }
    }

    // 定义字段更新事件
    public static event Action? NumberChanged;
}

步骤2:修改Counter.razor,赋值时自动触发事件

按钮点击逻辑里直接赋值即可,属性的setter会自动触发更新事件:

@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
        ClassNumber.txtnumber = currentCount;
    }
}

步骤3:修改NavMenu.razor,订阅事件并刷新组件

在NavMenu中订阅静态类的更新事件,事件触发时手动刷新组件以显示最新值:

<div class="top-row ps-3 navbar navbar-dark">
    <div class="container-fluid">
        <a class="navbar-brand" href="">BlazorApp1</a>
        <button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
            <span class="navbar-toggler-icon"></span>
        </button>
    </div>
</div>

<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
    <nav class="flex-column">
        <div class="nav-item px-3">
            <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
                <span class="oi oi-home" aria-hidden="true"></span> Home
            </NavLink>
        </div>
        <div class="nav-item px-3">
            <NavLink class="nav-link" href="counter">
                <span class="oi oi-plus" aria-hidden="true"></span> Counter
            </NavLink>
        </div>
        <div class="nav-item px-3">
            <NavLink class="nav-link" href="fetchdata">
                <span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
            </NavLink>
        </div>
        <!-- 显示静态类的最新计数 -->
        <div class="nav-item px-3 mt-3">
            Current Count: @ClassNumber.txtnumber
        </div>
    </nav>
</div>

@code {
    private bool collapseNavMenu = true;

    private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;

    private void ToggleNavMenu()
    {
        collapseNavMenu = !collapseNavMenu;
    }

    protected override void OnInitialized()
    {
        // 订阅字段更新事件,触发组件刷新
        ClassNumber.NumberChanged += () => StateHasChanged();
    }

    public void Dispose()
    {
        // 组件销毁时取消订阅,避免内存泄漏
        ClassNumber.NumberChanged -= () => StateHasChanged();
    }
}

核心逻辑说明

Blazor组件只会在自身状态(如绑定参数、组件内属性)变化时自动刷新,静态字段的变更无法被组件感知。通过给静态类添加更新事件,让NavMenu组件订阅该事件,在字段值改变时手动调用StateHasChanged()触发组件重新渲染,就能实现实时更新显示。

内容的提问来源于stack exchange,提问作者Xuân Cao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:40:37