首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Blazor -绑定到服务的属性,由另一个组件更改

Blazor 是一种使用 C# 和 HTML 构建交互式 Web UI 的框架,它允许开发者使用 .NET 在浏览器中运行代码。在 Blazor 中,组件之间的通信是一个常见的需求,尤其是当一个组件需要绑定到服务中的属性,并且这个属性可能会被另一个组件更改时。

基础概念

服务(Service):在 Blazor 中,服务通常是指实现了某种业务逻辑或提供数据的类。服务可以通过依赖注入(DI)被多个组件共享。

属性绑定(Property Binding):属性绑定是指将组件的属性与另一个对象的属性关联起来,使得当一个属性变化时,另一个属性也会自动更新。

组件通信(Component Communication):组件通信是指在 Blazor 应用中不同组件之间传递数据和事件的方式。

相关优势

  • 解耦:通过服务进行通信可以减少组件之间的直接依赖,使得组件更加独立和可复用。
  • 集中管理状态:服务可以作为应用状态的单一来源,便于管理和维护。
  • 响应式更新:当服务中的数据变化时,所有绑定到该数据的组件都会自动更新。

类型

  • 事件总线(Event Bus):通过发布和订阅事件来进行组件间通信。
  • 共享服务(Shared Service):通过依赖注入共享一个服务实例,组件通过该服务实例进行通信。
  • 参数传递(Parameter Passing):通过路由参数或组件参数直接传递数据。

应用场景

  • 全局状态管理:如用户登录状态、主题设置等。
  • 跨组件数据共享:如购物车、通知中心等。
  • 实时数据更新:如实时聊天、股票行情等。

遇到的问题及原因

问题:当一个组件绑定了服务的属性,但另一个组件更改了该属性后,绑定的组件没有更新。

原因

  1. 缺少通知机制:服务中的属性更改后,没有通知绑定的组件进行更新。
  2. 非响应式数据:服务中的属性可能不是响应式的,导致组件无法检测到变化。

解决方法

使用 INotifyPropertyChanged 接口

代码语言:txt
复制
public class SharedState : INotifyPropertyChanged
{
    private string _message;
    public string Message
    {
        get => _message;
        set
        {
            _message = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

在组件中绑定属性

代码语言:txt
复制
@page "/component-a"
@inject SharedState State

<p>@State.Message</p>

@code {
    protected override void OnInitialized()
    {
        State.PropertyChanged += State_PropertyChanged;
    }

    private void State_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == nameof(State.Message))
        {
            StateHasChanged();
        }
    }

    public void Dispose()
    {
        State.PropertyChanged -= State_PropertyChanged;
    }
}

在另一个组件中更改属性

代码语言:txt
复制
@page "/component-b"
@inject SharedState State

<button @onclick="ChangeMessage">Change Message</button>

@code {
    private void ChangeMessage()
    {
        State.Message = "New message!";
    }
}

通过这种方式,当 SharedState 中的 Message 属性被更改时,所有绑定到该属性的组件都会收到通知并更新 UI。

总结

Blazor 中通过服务进行组件间通信是一种有效的方式,可以确保数据的一致性和响应性。使用 INotifyPropertyChanged 接口可以实现属性更改的通知机制,从而保证绑定的组件能够及时更新。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Blazor 中的路由和路由模板

在客户端上,路由器参与多种情况,最常见的情况是用户单击链接、表单上的提交按钮或下拉列表中触发服务器调用的项。路由器绑定到内部位置更改事件,并从客户端处理导航到新请求路径的整个过程。...该表通过查看使用 Route 属性修饰的 Blazor 应用程序的组件进行填充。每个组件的路径都将成为受支持的路由模板。 目前,开发人员只有一种方法可以控制可访问的组件的路由路径:@page 指令。...总之,每个 Blazor 组件都必须通过 @page 指令指定其路由模板才能访问。Blazor 组件由 .cshtml 文件组成,该文件被编译为实现 IComponent 接口的 C# 类。...在 Blazor 中,路由器参数会自动分配给使用 [Parameter] 属性注释的组件的属性。根据参数和属性的名称进行匹配。...类型匹配是参数路由和自动绑定到变量的常见问题。如果 URL 的段包含文本字符串,但绑定变量声明类型为 int,会发生什么情况?

8.4K21
  • 结合使用 C# 和 Blazor 进行全栈开发

    ModelBase 类包含 Blazor 客户端应用程序或服务器应用程序可用来确定是否有任何验证错误的方法。它还会在此模型更改时触发事件,以便客户端能够更新 UI。... 标记是自定义 Blazor 组件,用于处理字段的数据绑定和错误显示逻辑。此组件只需要三个参数即可正常运行: Model 字段:标识数据要绑定到的类。...FieldName:标识数据要绑定到的数据成员。 DisplayName 字段:让组件可以显示易记消息。...OnInit 方法使用其中的一些测试数据来初始化模型类。它绑定到 ModelChanged 事件,并调用 CheckRules 方法来验证规则。...参数成员使用 Parameter 属性进行修饰,以便让 Blazor 知道它们是组件参数。 输入文本框的 oninput 事件连接到 OnFieldChanged 处理程序。

    6.7K40

    Blazor学习之旅(5)数据绑定

    本篇,我们来了解下在Blazor中数据是如何绑定的。 关于数据绑定 如果希望 HTML 元素显示值,可以编写代码来更改显示内容。如果值发生更改,则需要编写额外的代码以更新显示内容。...在 Blazor 中,可以使用数据绑定将 HTML 元素连接到字段、属性或表达式。 这样,当值发生更改时,HTML 元素便会自动更新。更新通常在更改后迅速发生,并且我们无需编写任何更新代码。...,例如:将其绑定到input标签时,它会绑定value属性。...-{PROPERTY}指令,就是告诉Blazor不仅要将更改到推送到组件,还要观察组件的任何修改并及时更新自己的状态。...通常来说,这种在父组件和子组件之间的数据绑定 也叫做 双向绑定。 同时,我们也注意到在Blazor中事件回调(委托)的统一类型为:EventCallback。

    53820

    Blazor VS Vue

    然后我们创建一个新的 Vue 应用程序并告诉它使用#app div 作为它的目标元素。v-model设置文本输入和name数据属性之间的绑定。...:我们已将标记移动到template属性中data在组件中表示为返回对象的函数通过这些更改,我们现在可以在应用程序中的任何位置渲染这个组件。...,但这次我们使用 Blazor 的@bind语法将我们的输入绑定到一个名为Name.当用户输入他们的名字时,Name属性将更新为他们输入的值。...传递数据 - Blazor从广义上讲,Blazor 具有相同的两个用于管理状态的主要选项。您可以使用属性将数据存储在组件本身中(如Name在我们的示例中)或通过参数获取数据(如Headline)。...现在,如果您对模型进行重大更改,Person如果您引入了任何影响客户端或服务器使用模型的重大更改,您将立即看到编译错误。优点和缺点现在我们已经看到它们都在行动,你应该选择哪一个?

    4.4K30

    Blazor入门:ASP.NET Core Razor 组件

    组件:项目 Blazor 中,使用 .razor 结尾的文件,称为组件;而 Blazor 中的组件,正式名称是 razor 组件; Blazor 组件是 razor 过渡而来的,使用 razor 的基本语法特性...目前,有两个地方需要使用 [Parameter] 特性,一个是前一小节的路由参数绑定,另一个是嵌入组件时使用。...被多个组件使用,不同组件要呈现不一样的内容; 要根据父组件的配置,显示子组件; 组件 A 要求使用到的组件 B,显示其传递的内容; 简单来说,就是将页面内容作为复杂类型传递给另一个组件,要求这个组件显示出来...那么,子内容指的是一个组件可以接收另一个组件的内容,使用 RenderFragment 来接收内容。...一般使用绑定的元素,其更新是自动的,不需要人为控制。 在能保证每一项的某个元素列,都是唯一的时候,我们可以使用 @key 关键字来优化组件。

    2.8K20

    Blazor WebAssembly 修仙之途 - 组件与数据绑定

    借用官方文档的描述: Blazor 应用是使用组件构建的。 组件是自包含的用户界面 (UI) 块,例如页、对话框或窗体。 组件包含插入数据或响应 UI 事件所需的 HTML Tag和处理逻辑。...更多关于组件的资料请查阅官方文档:创建和使用 ASP.NET Core Razor 组件 三.数据绑定 1.介绍 Razor 组件通过名为 @bind 的HTML元素属性提供数据绑定功能,这个绑定是双向的...@bind 是区分大小写的,例如:@BIND、@Bind 都是错误的,下面写了一个例子,将 CurrentValue 绑定到两个文本框中。...,仅当呈现组件时,UI才会更新文本框,而不响应于更改属性的值。...(2)子传父(链式绑定) 子传父,无法直接通过 @bind 来实现,需要单独指定事件处理程序和值,我们更改上面的子组件,定义一个 OnYearChanged 事件,并将其绑定到文本框的 oninput

    2.3K20

    分层 Blazor 组件

    虽然标记帮助器很有用,但仍存在一些编程缺陷,而 Blazor 组件则绝妙地消除了这些缺陷。在本文中,我将生成新的 Blazor 组件,以通过 Bootstrap 4 框架服务显示模式对话框。...尽管这很大地提高了灵活性,但任何更改也都需要通过编译步骤完成。具体而言,需要使用 C# 代码来描述 DIV 树及其所有属性集和子元素。...} public bool AutoClose { get; set; } } CascadingValue 元素捕获所提供的表达式,并自动将它与所有显式绑定到它的最靠中心组件共享。...此外,Blazor 中的模板属性是 RenderFragment 类型的属性。 上面源代码中有趣的地方是,绑定到级联值。...ModalContext OutermostEnv { get; set; } 如果未指定名称,级联值按类型绑定到级联参数。

    8.4K10

    .NET 9 预览版 5 发布

    新引入的Tensor类型旨在提供与AI库(如ML.NET)的高效互操作性,并支持数据操作,如索引和切片。 另一个有趣的更新是优先级无界通道。无界通道是指没有存储项目数量限制的线程通道。...ASP.NET Core 9预览版的第五个版本的这个更新主要集中在优化静态网络资产的交付和改善Blazor Server的重连体验上,同时还引入了用于运行时检测组件渲染模式的新特性以及其他各种改进,旨在简化开发并提升用户体验...运行时检测组件渲染模式:ComponentBase类现在包括一个Platform属性,即将更名为RendererInfo,具有Name和IsInteractive属性。...这些属性帮助开发者了解组件运行的位置以及是否可交互。 简化Blazor Web应用的认证状态序列化:新的API使得向现有项目添加认证变得更加容易。...此外,GitHub上还提供了所有五个.NET 9预览版中MAUI更改的完整列表。

    5300

    ASP.NET Core Blazor Webassembly 之 数据绑定

    上一次我们学习了Blazor组件相关的知识(Asp.net Core Blazor Webassembly - 组件)。这次继续学习Blazor的数据绑定相关的知识。当代前端框架都离不开数据绑定技术。...Blazor的单向数据绑定的用法跟ASP.NET Core MVC的Razor基本相似,不同点就是Blazor不需要Http回发到服务器就可以实时渲染新的界面出来。...双向绑定的多种写法 看到这里也许你也明白了,@bind真正的本质是由对value的绑定和对某个事件的绑定协同完成的。这点跟VUE非常相似。...父组件绑定数据到子组件 组件之间往往都是嵌套的,很多子组件都依赖父组件的数据来决定如何呈现,这种场景非常常见。...像下面这样: 直接通过组件的属性直接把父组件的数据传递到子组件,效果跟上面是一样的,而且这样子组件我还能少写一个changed

    4.9K30

    Blazor学习之旅(4)数据共享

    每个组件都可以包含 HTML 和 C# 代码的混合。组件是通过使用 Razor 语法编写的,其中的代码是用 @code 指令标记的。其他指令可用于访问变量、绑定到值以及实现其他呈现任务。...在父组件中,使用  标记指定将级联到所有子组件的信息。此标记作为内置的 Blazor 组件实现。在该标记内呈现的任何组件都将能够访问该值。...这里需要注意的是:级联值由父级中的 Name 属性标识,与 [CascadingParameter] 属性中的 Name 值匹配。...最终效果: 使用AppState模式共享 在不同组件之间共享信息的另一种方法是使用 AppState 模式。 即创建一个定义要存储的属性的类,并将其注册为作用域服务。...在要设置或使用 AppState 值的任何组件中,注入该服务,然后可以访问其属性。

    42420

    Blazor 版 Bootstrap Admin 通用后台权限管理框架

    根据微软的文档 Blazor 本人用 Blazor 技术将 Bootstrap Admin 后台管理框架重写了一版,通过自己编写组件系统的学习了一下 Blazor。...TableHeader 模板 本组件模板负责生成数据呈现 Table 的表头,通过 TItem 设置绑定字段属性,通过设置 @bind-Value lambda 表达式自动生成汉字表头 EditTemplate 模板 本组件负责数据的编辑功能,通过设置 @bind-Value 表达式实现双向绑定,直接调用服务器端保存方法即可 ...,实现了仅需要提供数据属性 @context.Name 即可,组件自动会通过 [DisplayName] 标签或者通过系统服务的字典表中匹配到中文文字,非常的方便 Blazor 多 Tab 版通用权限控制系统演示网站...其余页面等等批量更改

    3.5K10

    .NET周报 【5月第3期 2023-05-21】

    Masa Blazor组件库,通过创建 ServiceCollection ,用于注册服务,在和BlazorWebView进行绑定,将指定的html和BlazorWebView绑定以后在对于html内的...id为 app 的元素进行Blazor组件的绑定绑定到Blazor组件的 App 组件中。...文章详细介绍了Masa Blazor组件库的使用方法,包括如何在Winform的MainFrom的文件中创建 ServiceCollection ,用于注册服务,在和BlazorWebView进行绑定,...将指定的html和BlazorWebView绑定以后在对于html内的id为 app 的元素进行Blazor组件的绑定绑定到Blazor组件的 App 组件中;以及如何在 MApp 中使用 Masa Blazor...-Blazor - Blazor 组件的流式渲染 - 处理 Blazor SSR 表单提交 - 路由到 Blazor 中的命名元素 - 用于 Blazor WebAssembly 应用程序的 Webcli

    30640

    Blazor VS React Angular Vue.js

    Blazor 功能特性 •使用C#代替JavaScript和TypeScript构建 Web UI•构建渐进式Web应用程序(PWA)•创建和使用用C#编写的可重用组件•在服务器端模式提供全面的调试支持...,在客户端模式进行一些限制的调试•与HTML DOM的数据绑定(有限的双向绑定)•使用C#在客户端和服务器之间共享代码•可在所有现代网络浏览器(包括移动浏览器)中使用•Blazor代码具有与JavaScript...如果您的企业现在需要可用于生产的SPA并具有JavaScript专业知识,那么React将比Blazor更好的选择,但是,如果团队由C#开发人员组成并且SPA有发展的空间,请考虑使用Blazor。...Angular的更高版本也以类似于Blazor的方式支持服务器端渲染。模板语法与razor语法类,并且具有数据绑定的HTML DOM UI组件。...因此,对于目前需要开发SPA的团队来说,Vue.js可能是另一个不错的选择,但是再次强调,将Blazor与C#结合使用对于具有C#背景的团队可能会产生更好的结果。

    5.5K10

    Blazor资源大全,很棒的Blazor(2)

    该工具集还包括查询工具,用于发出复杂的本地或远程查询,更改跟踪工具,将仅更改的记录发送到服务器,高级验证属性,全球化工具,修改现有组件的“行为”,状态管理和保存等等。...单独的组件 API Head Element Helper - 用于更改文档标题和元素的和组件,支持服务器端预渲染以用于SEO/OGP。(演示)....接口自动检测组件中的状态更改。...在本次演讲中,我们将看看对自定义元素的新支持、改进的数据绑定、处理位置更改事件、显示加载进度、动态身份验证请求等方面的支持。...使用ServiceStack在Blazor中进行快速开发模型和类型化的端到端服务 - 2022年5月19日 - 在这个视频中,我们使用ServiceStack Blazor WASM模板,展示了使用类型化的端到端服务和

    83520

    Asp.net Blazor工作原理解析

    这些动态代码块会嵌入到生成的C#类中,以便在运行时执行。 HTML属性: Razor引擎会识别HTML标记中的属性,并将其解析为C#属性或字段。...对于使用@符号绑定的属性,Razor引擎会将其识别为动态属性,并在生成的C#代码中生成相应的属性访问或绑定逻辑。...,这个页面的内容由 服务器 执行BuildRenderTree函数生成的。...从代码的角度大致简化工作流程如下: 客户端请求页面: 客户端(浏览器)发送请求到服务器,请求Blazor应用程序的页面。 服务器处理请求: 服务器接收到请求后,会执行相应的处理逻辑。...在Blazor Server模式下,服务器会实例化Blazor组件,并调用其BuildRenderTree方法来生成HTML内容。

    29310

    ASP.NET Core Blazor 初探之 Blazor WebAssembly

    而Blazor Server可以认为是前者的服务端渲染版本,它使用SignalR实现了客户端的实时通讯,它的计算跟渲染都在服务端处理。...@bind指令本质上是通过对value跟onchange这个属性的绑定配合来实现双向绑定,这个套路怎么那么熟悉?对了VUE也是这么干的,笑哭。...组件属性 我们封装组件经常对外暴露属性,以便接受外部传入的数据,比如我们这个Edit组件就需要外部传入一个Student对象才能正常工作。...这样的话,这个属性就可以接受父组件的传参,注意这个属性是单项数据流,组件内对Student修改并不会修改外部组件的数据源,这个也很VUE啊,笑哭。...总结 通过以上,我们使用Blazor实现了一个简单的前后端分离的SPA。总体涉及了Blazor的几个重要知识点,比如:数据绑定,事件处理,封装组件,JavaScript交互等。

    6.6K10

    Blazor VS React Angular Vue.js

    UI组件,但是,Blazor使用了C#来替代JavaScript进行处理,因此开发人员可以跨平台共享代码,Blazor使用Razor脚本声明HTML,这是.NET开发人员熟悉的脚本,Razor通过维护一种简单的语法来使开发人员接近...C#编写的可重用组件 在服务器端模式提供全面的调试支持,在客户端模式进行一些限制的调试 与HTML DOM的数据绑定(有限的双向绑定) 使用C#在客户端和服务器之间共享代码 可在所有现代网络浏览器(包括移动浏览器...如果您的企业现在需要可用于生产的SPA并具有JavaScript专业知识,那么React将比Blazor更好的选择,但是,如果团队由C#开发人员组成并且SPA有发展的空间,请考虑使用Blazor。...Angular的更高版本也以类似于Blazor的方式支持服务器端渲染。模板语法与razor语法类,并且具有数据绑定的HTML DOM UI组件。...因此,对于目前需要开发SPA的团队来说,Vue.js可能是另一个不错的选择,但是再次强调,将Blazor与C#结合使用对于具有C#背景的团队可能会产生更好的结果。

    5K00

    .NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!

    以下是此预览版中的新功能摘要: 服务器和中间件 默认情况下禁用HTTP/3 API编写 在最小API、MVC和SignalR中支持键入服务 Blazor Blazor Web App模板更新 从额外的程序集中发现用于静态服务器呈现的组件...服务器和中间件 默认情况下禁用HTTP/3 Kestrel中默认情况下不再启用HTTP/3。这个更改将Kestrel的HTTP协议行为恢复到.NET 7状态,但不同于所有.NET 8预览版本。...您现在可以根据请求静态地从服务器呈现Blazor组件,逐渐增强体验,增强导航和表单处理,流式服务器呈现更新,并根据需要添加丰富的交互性,使用Blazor Server或Blazor WebAssembly...使用WebAssembly或Auto渲染模式的任何组件必须从客户端项目构建。 Blazor Web App模板具有清理的文件结构: 新的Components文件夹包含服务器项目中的所有组件。...在客户端项目中带有渲染模式属性的组件,2. 服务器项目中使用客户端组件的页面。这个解决方案是不必要的。可以在将其指令复制到客户端项目后,将服务器项目中的组件删除。

    33840

    共享数据之Transfer service

    [Blazor] .NET 7 Blazor 组件通信(参数、事件回调和状态/服务)练习 在 Blazor 中,可以使用三种方法在组件之间共享数据: CascadingParameter....传输服务是在 Blazor 中的组件之间共享数据的有用方法,尤其是当所有组件都需要使用相同的数据(也称为“单一事实来源”)时。...声明Transfer 服务 使用Transfer 服务 声明transfer 服务 Transfer 服务充当模型,包含每个属性的属性和事件。...若要在类中使用传输服务,需要将服务注入到类的构造函数中,并以与传输服务类相同的方式注册它。在本教程中,我们将重点介绍如何在组件中使用传输服务。...下面介绍如何在组件中使用传输服务: 注入传输服务并在组件的指令部分中实现接口。

    27220
    领券