我创建了一个带有标签和一些跨度的自定义输入。(为了简化示例,以下未显示跨度。(
<div>
<label for="length">length</label>
<input type="number" id="length" @bind-value="@Length" min="100" max="500">
</div>
<span>@Length</span>
@code {
private static double length = 300;
private static int Length
{
get => (int)length;
set => length = value;
}
}
由于我多次需要这种自定义输入,我创建了一个剃刀组件LabeledInput.razor:
<div>
<label for="@ID">@LabelText</label>
<input type="number" id="@ID" @bind-value="@BindValue" min="@Min" max="@Max">
</div>
@code {
[Parameter] public int BindValue { get; set; }
[Parameter] public string ID { get; set; }
[Parameter] public string LabelText { get; set; }
[Parameter] public int Max { get; set; }
[Parameter] public int Min { get; set; }
}
但当我把它用作时
[code from above]
<LabeledInput ID="length" LabelText="length2" Min="100" Max="500" BindValue="@Length"></LabeledInput>
单击CCD_ 1的微调器按钮不会更新GUI上的CCD_。另一方面,单击普通Input
的微调器按钮确实会更新跨度以及LabeledInput
。因此,存在绑定,但仅限于一个方向。
我做错了什么?
您想要的是在父组件和子组件之间创建双向数据绑定。为了实现这一点,您必须在父组件中创建一个Value
属性,如下所示:
private int Value { get; set; }
Value
属性要求您在子组件中定义婴儿车属性,如下所示。。。我们称之为Value
[Parameter]
Public int Value { get; set; }
此外,你必须创建一个事件回调婴儿车属性,如下所示:
[Parameter]
Public EventCallback<int> ValueChanged { get; set; }
ValueChanged
将包含在则触发CCD_ 9。请注意,EventCallback的类型是int,这意味着您应该将int值传递给方法(在我们的例子中,它是在父组件中定义的LabeledInput
0属性
索引.razor
@page "/"
<Child @bind-Value="@Value" Min="0" Max="100" />
<div>@Value.ToString()</div>
@code
{
private int Value { get; set; } = 10; // default value
}
Child.razor
<div>
<input type="number" value="@Value"
@onchange="@((args) => ValueChanged.InvokeAsync(Convert.ToInt32(args.Value)) )"
min="@Min" max="@Max">
</div>
@code {
[Parameter]
public int Value { get; set; }
[Parameter]
public EventCallback<int> ValueChanged { get; set; }
[Parameter] public int Max { get; set; }
[Parameter] public int Min { get; set; }
}
复制、测试然后调整。。。
请注意,您可以指定一个方法的名称,而不是像上面那样为@onchange指令提供lambda表达式,您必须定义该名称,并从中更新Value
属性
更新:
为什么我不能更改子组件的属性名称Value?
规则如下:如果将参数属性命名为BindValue
,则如下:
[Parameter]
public int BindValue { get; set; }
然后,EventCallback属性应该命名为:BindValueChanged
,如下所示:
[Parameter]
public EventCallback<int> BindValueChanged { get; set; }
它被用在像这样的父组件中:
<Child @bind-BindValue="@Value" Min="0" Max="100" />
也就是说,您应用@bind指令,再加上一个连字符,再加上子组件中定义的参数属性的名称。其值:"@Value"
是绑定到子组件的本地属性的名称,并且每当您更改input type="number"
元素中的值时,都会使用从子组件传递的新值进行更新。明白了吗?