0

在我的 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 中的“登录面板”发生变化。如果所有内容都在一个文件中,并且我只检查特定变量是否为空(请参见此处),我能够使其正常工作,因此我假设 Blazor 框架具有特定的标准,这些标准会禁止页面重新-评估这些块。这是准确的吗?如果是这样,强制重新评估的最佳方法是什么?

编辑:我又玩了一点,最终发现了StateHasChanged受保护的成员函数,我假设它是在 Init 完成后调用的,因此前面的示例有效。我认为一个可行的解决方案是让我的UserInfo对象实现INotifyPropertyChanged,然后在 MainLayout.cshtml 中注册一个更改处理程序StateHasChanged(),以在登录状态更改时调用需要更新的视图。

4

1 回答 1

2

是的。Blazor 使用名为StateHasChangedjust like的东西INotifyPropertyChanged

但是不同的是,在XAML框架中,XAML只会更新那些已调用的属性INotifyPropertyChanged,但在 Razor 中,当StateHasChanged被调用时,UI 框架将刷新元素所在的组件的整个 UI 树(至少到目前为止)。那么谁打电话给StateHasChanged如果不是你做的。当一个元素获得输入(您正在单击一个按钮)时,blazor 将自动设置StateHasChanged引擎盖下的值。

更多阅读"

https://github.com/aspnet/Blazor/issues/409

https://learn-blazor.com/pages/data-binding/

https://github.com/aspnet/Blazor/issues/359

https://github.com/aspnet/Blazor/issues/407

于 2018-04-08T14:22:43.180 回答