Blazor [Parameter] 不更新输入变量
Blazor [Parameter] not updating input variables
我有一个自定义组件 InlineAutocomplete
。无论我做什么,我的 pic
值和 SelectedPIC
值在我进行验证时始终为 null,但不确定为什么会这样。
该组件确实正确呈现,但无法使用正确设置的值取回我的参数。
用法如下:
<InlineAutocomplete TItem="PIC"
Value="@pic"
Selected="@SelectedPIC"
Data="@PICs"
Property="@((item) => item.PICNumber)" />
我的组件:
<div class="inline-autocomplete">
<input @oninput="(e)=> SuggestItem(e)" type="text" @bind-value="@Value" class="overlap inline-autocomplete-input " />
<input readonly class="overlap inline-autocomplete-label" value="@_suggestedValue" />
</div>
@code {
string _value;
string _suggestedValue;
[Parameter]
public string Value
{
get => _value;
set
{
if (value == null)
return;
_value = value;
}
}
[Parameter]
public List<TItem> Data { get; set; }
[Parameter]
public Func<TItem, string> Property { get; set; }
[Parameter]
public TItem Selected { get; set; }
void SuggestItem(ChangeEventArgs e)
{
if (string.IsNullOrEmpty(e.Value.ToString()))
return;
Value = e.Value.ToString().ToUpper();
if (string.IsNullOrEmpty(Value))
{
_suggestedValue = string.Empty;
}
else
{
var selectedItem = Data.Select(Property).FirstOrDefault(x => x.StartsWith(Value, StringComparison.OrdinalIgnoreCase));
_suggestedValue = !string.IsNullOrWhiteSpace(selectedItem) ? selectedItem : string.Empty;
Selected = Data.FirstOrDefault(x => string.Equals(Property(x), Value, StringComparison.OrdinalIgnoreCase));
StateHasChanged();
}
// State has changed
StateHasChanged();
}
}
解决这个问题的方法是传递一个函数来更改 Parent 中的 属性 而不是 Child.
Child:
[Parameter]
public Action<string, TItem> ValueChanged { get; set; }
...
@code {
void SomeFunction() {
ValueChanged(Value, Selected);
}
}
Parent:
<InlineAutocomplete ... ValueChanged="FireEvent" />
void FireEvent(string stringVal, MyClass c)
{
// ... Do Something
}
我有一个自定义组件 InlineAutocomplete
。无论我做什么,我的 pic
值和 SelectedPIC
值在我进行验证时始终为 null,但不确定为什么会这样。
该组件确实正确呈现,但无法使用正确设置的值取回我的参数。
用法如下:
<InlineAutocomplete TItem="PIC"
Value="@pic"
Selected="@SelectedPIC"
Data="@PICs"
Property="@((item) => item.PICNumber)" />
我的组件:
<div class="inline-autocomplete">
<input @oninput="(e)=> SuggestItem(e)" type="text" @bind-value="@Value" class="overlap inline-autocomplete-input " />
<input readonly class="overlap inline-autocomplete-label" value="@_suggestedValue" />
</div>
@code {
string _value;
string _suggestedValue;
[Parameter]
public string Value
{
get => _value;
set
{
if (value == null)
return;
_value = value;
}
}
[Parameter]
public List<TItem> Data { get; set; }
[Parameter]
public Func<TItem, string> Property { get; set; }
[Parameter]
public TItem Selected { get; set; }
void SuggestItem(ChangeEventArgs e)
{
if (string.IsNullOrEmpty(e.Value.ToString()))
return;
Value = e.Value.ToString().ToUpper();
if (string.IsNullOrEmpty(Value))
{
_suggestedValue = string.Empty;
}
else
{
var selectedItem = Data.Select(Property).FirstOrDefault(x => x.StartsWith(Value, StringComparison.OrdinalIgnoreCase));
_suggestedValue = !string.IsNullOrWhiteSpace(selectedItem) ? selectedItem : string.Empty;
Selected = Data.FirstOrDefault(x => string.Equals(Property(x), Value, StringComparison.OrdinalIgnoreCase));
StateHasChanged();
}
// State has changed
StateHasChanged();
}
}
解决这个问题的方法是传递一个函数来更改 Parent 中的 属性 而不是 Child.
Child:
[Parameter]
public Action<string, TItem> ValueChanged { get; set; }
...
@code {
void SomeFunction() {
ValueChanged(Value, Selected);
}
}
Parent:
<InlineAutocomplete ... ValueChanged="FireEvent" />
void FireEvent(string stringVal, MyClass c)
{
// ... Do Something
}