我的要求是有一个文本输入,用户可以在其中输入文本,但也可以以其他方式设置其值(例如,通过按钮)。我在 blazor 服务器项目中使用 .Net 7。我创建了以下简单的 UI 来重现我在更复杂的构造中遇到的问题:
剃须刀代码:
Text Input:
<input type="text" @bind-Value=Value @bind-Value:event="oninput" />
<br />
<button class="btn btn-primary" @onclick="IncrementCounter">Increment Counter and set Value </button>
<br />
Current Value: @Value
<br />
Current Counter Value: @_counter
C# 代码:
@code {
private int _counter = 1000;
private string? Value { get; set; }
private void IncrementCounter()
{
_counter++;
Value = _counter.ToString();
}
}
当我单击按钮时,文本输入中的值将按预期设置。即,它被设置为计数器的当前值并且计数器递增。当我在文本输入中输入某些内容时,该值会显示在按钮下方(“当前值”)。但是,现在该按钮不再更新文本输入的内容。的纯文本@Value
仍然显示该Value
属性已按预期设置。从文本输入到Value
属性的绑定仍然有效,但反之则不然。任何如何解决这个问题的想法都非常受欢迎。
我试过:
INotifyPropertyChanged
为财产实施Value
。StateHasChanged
内调用IncrementCounter()
。- 致电酒店
StateHasChanged
内Value
。 StateHasChanged
通过另一个按钮呼叫。- 另一个示例,其中文本输入位于
Value
带有Parameter
. 在此示例中,我还实现了一个ValueChanged EventCallback
.
什么都没起作用。
抱歉,我当时很绝望。
您需要使用
@bind-value
(小写“v”)或@bind
单独使用。布拉佐小提琴
作为@RBee 答案的补充,您可以取消文本转换代码并直接绑定到计数器。
当 Razor 编译器将绑定功能构建到生成的 C# 组件类中时,它将在幕后实现必要的转换代码。