我有一个组件,它会在切换到其他页面时弹出一个对话框,询问您是否确定要放弃更改。我将其放在每个页面上,如下所示:
<ConfirmNavigation HasUnsavedChanges="@HasUnsavedChanges" />
此组件包括:
[Parameter]
public bool HasUnsavedChanges { get; set; }
private async Task OnBeforeInternalNavigation(LocationChangingContext context)
{
if (!HasUnsavedChanges)
return;
我的问题是,在父页面中,处理提交点击,我有:
HasUnsavedChanges = false;
await Task.Delay(1);
Navigation.NavigateTo(gotoUrl);
这不起作用。该方法在执行完这两行代码后返回,并且ConfirmNavigation
仍然认为HasUnsavedChanges
是 true。
有没有办法让 的改变值变成HasUnsavedChanges
?ConfirmNavigation
我最好的选择是添加一个方法来ConfirmNavigation
设置值吗?我不喜欢这样做,因为它绕开了 ,这HasUnsavedChanges="@HasUnsavedChanges"
违反了组件应该如何交互。
你的问题是这样的。当你设置
在父级中,您正在将其分配
false
给父级中的全局变量。仅当在由父级中的渲染事件触发的渲染级联期间调用时,该值才会应用于
HasUnsavedChanges
子级中的属性。parameters.SetParameterProperties(this);
SetParametersAsync
bool
是一种值类型。您可以通过将其添加到来记录执行顺序
ConfirmNavigation
并将控制台记录到
OnBeforeInternalNavigation
。对于您的逻辑,最简单的解决方案是将可变对象作为参数传递,而不是布尔值。
你现在传递了一个引用,所以两个组件都在看同一个东西。你几乎肯定会丢失
await Task.Delay(1);
整个阻止导航操作的代码编写起来有点棘手。在中注册的处理程序
RegisterLocationChangingHandler
由导航管理器调用。您对代码的执行顺序的控制有限。添加控制台日志将显示代码执行的顺序。
除非绝对必要,否则我不喜欢抛球
await Task.Delay(1);
,我想不出更好的办法,而且我完全理解为什么。