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

Blazor Server共享实例变更后兄弟组件未同步更新的问题

解决Blazor Server共享单例对象UI同步更新问题

1. 让Employee类实现INotifyPropertyChanged接口

核心是给共享对象加上属性变更通知能力,当Name属性修改时自动触发事件,通知所有监听的组件:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class Employee : INotifyPropertyChanged
{
    private string _name;

    public string Name
    {
        get => _name;
        set
        {
            if (_name != value)
            {
                _name = value;
                OnPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

2. 在绑定对象的组件中订阅变更事件

每个需要同步更新的组件(比如Welcome.razor和ChangeName.razor)都要订阅Employee的PropertyChanged事件,在事件触发时调用StateHasChanged()更新UI,同时要在组件销毁时取消订阅,避免内存泄漏。

Welcome.razor示例:

@inject Employee EmployeeInstance
@implements IDisposable

<h1>Welcome, @EmployeeInstance.Name!</h1>

@code {
    protected override void OnInitialized()
    {
        EmployeeInstance.PropertyChanged += OnEmployeePropertyChanged;
    }

    private void OnEmployeePropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        // 可以只监听Name属性变化,也直接调用StateHasChanged处理所有属性变更
        if (e.PropertyName == nameof(Employee.Name))
        {
            StateHasChanged();
        }
    }

    public void Dispose()
    {
        EmployeeInstance.PropertyChanged -= OnEmployeePropertyChanged;
    }
}

ChangeName.razor示例:

@inject Employee EmployeeInstance
@implements IDisposable

<input @bind="EmployeeInstance.Name" />

@code {
    protected override void OnInitialized()
    {
        EmployeeInstance.PropertyChanged += OnEmployeePropertyChanged;
    }

    private void OnEmployeePropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        StateHasChanged();
    }

    public void Dispose()
    {
        EmployeeInstance.PropertyChanged -= OnEmployeePropertyChanged;
    }
}

原理说明

之前的问题是:单例Employee的属性变化时,Blazor组件无法感知到这个变更,仅在修改组件内调用StateHasChanged()只能更新自身。通过实现INotifyPropertyChanged,所有绑定该对象的组件都能收到属性变更通知,进而自动触发UI更新,替代静态方法这类不优雅的临时方案。

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:42:41