如何实现Blazored.Modal值类型参数的级联更新?
问题描述
Blazored.Modal的官方文档对父组件向模态框传参很有帮助,但我们遇到了一个问题:父组件更新原始类型参数时,模态框里的值没法同步更新。
父组件中定义的级联参数:
[CascadingParameter] public bool IsTodayFriday { get; set; } [CascadingParameter] public Employee employee { get; set; } [CascadingParameter] public IModalService iModal { get; set; } = default!;
向模态框传递参数的代码:
var emp= new Employee(); var parameters = new ModalParameters() .Add(nameof(emp), emp) .Add(nameof(IsTodayFriday ), IsTodayFriday ); iModal.Show<CheckDateAndLeaveEarly>("Get off early?", parameters);
模态框组件(Modal.razor.cs)接收参数的代码:
[Parameter] public bool IsTodayFriday { get; set; } [Parameter] public Employee employee{ get; set; } [CascadingParameter] public IModalService iModal { get; set; } = default!;
目前参数能正常传递,但IsTodayFriday是按值传递的,父组件里的源值变化后,模态框内的值不会同步更新。我们知道可以把它包装成对象按引用传递,但想知道有没有更简便的方式来级联原始类型值?
解决方案
方法1:用极简包装类实现引用传递
不用自定义复杂结构,写个通用的包装类即可:
public class ValueWrapper<T> { public T Value { get; set; } }
父组件中把IsTodayFriday改成包装类型:
[CascadingParameter] public ValueWrapper<bool> IsTodayFriday { get; set; } = new();
传参时直接传递包装对象:
parameters.Add(nameof(IsTodayFriday), IsTodayFriday);
模态框里接收后,直接绑定IsTodayFriday.Value,父组件更新Value时,模态框会自动同步变化。这是最简便易维护的方式。
方法2:通过事件回调同步更新
如果不想用包装类,可以借助事件回调让模态框感知父组件的参数变化:
- 父组件定义事件并在参数变化时触发:
public event Action<bool>? OnIsTodayFridayChanged; private void UpdateIsTodayFriday(bool newValue) { IsTodayFriday = newValue; OnIsTodayFridayChanged?.Invoke(newValue); }
- 传参时把事件回调传给模态框:
parameters.Add(nameof(OnIsTodayFridayChanged), OnIsTodayFridayChanged);
- 模态框接收并订阅事件,更新自身状态:
[Parameter] public bool IsTodayFriday { get; set; } [Parameter] public Action<bool>? OnIsTodayFridayChanged { get; set; } protected override void OnInitialized() { base.OnInitialized(); OnIsTodayFridayChanged += (newValue) => { IsTodayFriday = newValue; StateHasChanged(); }; } // 组件销毁时取消订阅,避免内存泄漏 public void Dispose() { OnIsTodayFridayChanged -= (newValue) => { IsTodayFriday = newValue; StateHasChanged(); }; }
方法3:直接级联包装后的参数
如果父组件的IsTodayFriday本身是级联过来的,可以跳过ModalParameters,直接用级联值包裹模态框的触发逻辑:
<CascadingValue Value="IsTodayFriday"> <!-- 这里放触发打开模态框的按钮/逻辑 --> </CascadingValue>
然后在模态框里用[CascadingParameter]接收这个包装对象,就能自动同步父组件的参数变化。
内容的提问来源于stack exchange,提问作者Cal
相关产品推荐
相关产品推荐

