Что вызывает повторное вычисление / else выражений?

asp.net-core blazor c#

Вопрос

Работая с шаблоном, размещенным в Blazor, в моем MainLayout.cshtml у меня есть что-то вроде:

@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 защищенного члена StateHasChanged , которая, как я полагаю, вызывается после завершения Init, поэтому почему работает предыдущий пример. Я думаю, что рабочим решением будет иметь объект UserInfo реализующий INotifyPropertyChanged , а затем зарегистрировать обработчик изменений внутри MainLayout.cshtml, чтобы вызвать StateHasChanged() для представлений, которые необходимо обновить при изменении состояния входа.

Принятый ответ

Да. Blazor использует что-то, называемое StateHasChanged как INotifyPropertyChanged .

Однако разница в XAML- инфраструктурах XAML будет обновлять только те свойства, которые вызвали INotifyPropertyChanged , но в Razor, когда StateHasChanged называется, инфраструктура пользовательского интерфейса StateHasChanged все дерево пользовательского интерфейса компонента ( по крайней мере, на данный момент ), элемент находится , Тогда кто вызвал StateHasChanged если он не был сделан вами. Когда элемент получает вход (вы нажимаете кнопку), блейзер автоматически устанавливает 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



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему