无法让 StateHasChanged 更新 @if 语句

Posted

技术标签:

【中文标题】无法让 StateHasChanged 更新 @if 语句【英文标题】:Trouble getting StateHasChanged to update an @if Statement 【发布时间】:2021-12-02 06:22:56 【问题描述】:

所以我无法让我的 Razor 页面更新 if 语句。

这个想法是当用户选择一个按钮时,它会重新计算字符串以寻找有多少 X 值,现在我们正在寻找空格。如果有一个空格,我希望输入字段被锁定(用户没有理由编辑它)。如果有多个空格,则解锁。

下面是包含标签的 if 语句

                @if (NumOfSelectedValue <= 1)
            
                <input class="form-control-sm" value="1" style="width: 40px" disabled />
            
            else if (NumOfSelectedValue > 1)
            
                <input class="form-control-sm" value="@NumOfSelectedValue" style="width: 40px" />
            

这是我认为它会如何更新的逻辑。

    public void SpaceSelected() //ive used "async task"

    int NumOfSelectedValue = SelectedCell.Count(x => x == ' ');//counting how many spaces there are with Linq
    Console.WriteLine(NumOfSelectedValue);//post num of spaces in the console

    //other versions ive used 
    //StateHasChanged();//update the if statement
    //await InvokeAsync(StateHasChanged);

    InvokeAsync(StateHasChanged);

【问题讨论】:

您的 razor 代码检查 NumOfSelectedValue,这可能是您拥有的字段或者是编译时错误。您在SpaceSelected 中定义的local 变量NumOfSelectedValue 代表的不是同一件事,实际上没有完成任何可能影响剃须刀代码的事情。 啊我没有显示它,但在第二块代码之上我有 public string NumOfSelectedValue get;放; 是的,这是一个 C# 错误——在你的方法中从 NumOfSelectedValue 中删除 int 前缀。 【参考方案1】:

根据您的 cmets,您有一个名为 NumOfSelectedValue公共财产。这与您在SpaceSelected 中定义的局部变量 NumOfSelectedValue 不同。您的解决方案是不声明该局部变量,而只是更新属性:

public void SpaceSelected()

    NumOfSelectedValue = SelectedCell.Count(x => x == ' ');
    StateHasChanged();  // Probably not necessary unless you're calling this method in the background

请注意,我们在赋值前面不再有 int 部分,这是声明变量的部分。

【讨论】:

我会支持你,但我不够酷。 @Nuka,很高兴我能帮上忙。 :)

以上是关于无法让 StateHasChanged 更新 @if 语句的主要内容,如果未能解决你的问题,请参考以下文章

Blazor StateHasChanged 无法正常工作

Blazor 中的 StateHasChanged() 与 InvokeAsync(StateHasChanged)

何时在 Blazor 组件中调用 StateHasChanged()

我应该何时调用 StateHasChanged 以及 Blazor 何时自动拦截某些更改?

Blazor 中的 StateHasChanged 目标

如何修复“当前线程与渲染器的同步上下文无关”?