在我的MainLayout.cshtml中使用Blazor托管模板,我有类似的东西:
@inject UserInfo userInfo
@if(userInfo.Name == "bob")
{
<div class="login-panel">
<p>Hi Bob!</p>
</div>
}
else
{
<LoginPanel />
}
然后在单独的Login.cshtml中:
@inject UserInfo userInfo
async void Login()
{
userInfo.Name = "bob";
}
但登录不会导致更改MainLayout.cshtml中的“登录面板”。如果所有内容都在一个文件中,并且我只检查某个特定变量是否为null(参见here),我能够让它工作,所以我假设Blazor框架有特定的标准,这是非法的页面重新评估此类块。这准确吗?如果是这样,强制进行重新评估的最佳方法是什么?
编辑:我玩了一下,最终发现了StateHasChanged
受保护的成员函数,我假设在Init完成后调用它,因此上一个示例的工作原理。我认为一个有效的解决方案是让我的UserInfo
对象实现INotifyPropertyChanged
,然后在MainLayout.cshtml中注册一个更改处理程序,以便为登录状态更改时需要更新的视图调用StateHasChanged()
。
答案 0 :(得分:1)
是。 Blazor使用StateHasChanged
之类的内容,就像INotifyPropertyChanged
一样。
但不同之处在于,在 XAML 框架中, XAML 将仅更新已调用INotifyPropertyChanged
的属性,但是当StateHasChanged
被称为UI框架时,Razor将刷新元素所在的组件的整个UI树(至少截至现在)。
然后,如果你没有完成,StateHasChanged
已经打过电话。当一个元素得到一个输入(你点击一个按钮)时,该剃刀会自动设置StateHasChanged
。
更多读“
https://github.com/aspnet/Blazor/issues/409
https://learn-blazor.com/pages/data-binding/