我有一个页面,其中的Order对象声明为CascadingValue。该父页面有2个子页面,一个带有订单信息,另一个带有订单上的订单项列表。这些兄弟页面中的每一个都通过CascadingValue使用Order信息。
订单信息页面上有一个按钮,应清除订单上的所有订单项。该按钮起作用,并且通过调用Order CascadingValue上的ClearLineItems方法清除所有订单项。
不过,包含订单项列表的页面并未刷新。它仍然显示现在已删除的订单项。一页如何告诉其兄弟页面其StateHasChanged?
要绘制订单项,我有一个名为LineItemDetail的控件,我将其绘制为这样。 (每行上都有一个按钮,允许用户仅删除该行,这是DeleteLine参数。逐行删除功能正常)
@foreach (var row in CurrentOrder.LineItems)
{
<LineItemDetail CurrentLine=@row DeleteLine=@DelLine></UpchargeInfo>
}
这真的是更大的问题,如何将消息从一个Blazor页面发送到另一页面。就像消息总线一样,但在Blazor内部。
这说明了问题。从子窗体添加订单项不会更新父窗体,也不会更新其他同级。一个人必须积极地刷新父级,然后级联下来更新子级。 https://github.com/bradirby/BlazorChildFormUpdates
答案 0 :(得分:0)
我的原始答案似乎已经过时;除了使用EventCallbacks可以解决问题之外。
这是我的新答案:
添加对组件的引用。像这样:
<Component1 @ref="comp1" SiblingComponent="@comp2" />
<Component2 @ref="comp2" SiblingComponent="@comp1" />
@code {
public ElementReference comp1 { get; set; }
public ElementReference comp2 { get; set; }
}
然后在Component1和Component2内部调用SiblingComponent.UpdateState()
然后SiblingComponent填充
private void UpdateState() {
StateHasChanged();
}
明显不满意的答案:
最可能的问题不是不是未调用StateChanged,而是实际上该同级页面的状态没有更改。 您不能在子组件中更改级联值。仅针对该子组件中的副本更改它,而不更改父组件中的副本。 您有一些选择。但最合适的方法可能是回调方法。您对子组件的操作会触发父组件中的方法,该方法会更改父级别的值,从而更新子组件中的值。