问题描述
我试图将一个属性作为委托传递给一个 blazor 组件。但是,我收到了 Delegate 'Func<Pen,int,stirng>' doest not take 1 arguement
错误。并且不确定正确的语法应该是什么。
下面是组件:
@typeparam TItem
<div class="MarelAutoComplete">
<div class="MarelAutoCompleteList">
@foreach (var item in Data.Select(Property))
{
...
}
</div>
</div>
@code {
[Parameter]
public List<TItem> Data { get; set; }
[Parameter]
public Func<TItem,string> Property { get; set; }
}
<MyComponent TItem="Pen"
TValue="myVal"
Data="Pens"
Property="pen => pen.PenNumber" /> // Error On This Line.
@code {
List<Pen> Pens { get; set; }
}
解决方法
您报告的错误是 Delegate 'Func<Pen,int,stirng>' doest not take 1 arguement
,但 Property
被定义为 Func<TItem,string>
。
Func<TItem,string> Property
说我想要一个看起来像这样的函数:
string MyMethod(TItem item)
您的匿名函数是 pen => pen.PenNumber
,Property 期望 pen.PenNumber
作为字符串。是吗?
这是您正在做的工作的简化版:
文本框.razor@typeparam TItem
<h3>@Value</h3>
@foreach (var item in Data.Select(this.Property))
{
<div>@item</div>
}
@code {
[Parameter] public string Value { get; set; } = "Bonjour";
[Parameter] public Func<TItem,string> Property { get; set; }
[Parameter] public List<TItem> Data { get; set; }
}
Index.razor
@page "/"
@using Blazor.Starter.Data
<div>
<TextBox TItem="Model" Data="models" Property="item => item.Value"></TextBox>
</div>
@code {
public string GetProperty(Model model)
{
return model.Value;
}
public List<Model> models => new List<Model>()
{
new Model() { Value = "Fred"},new Model() { Value = "Jon"},new Model() { Value = "Bob"},};
public class Model
{
public string Value { get; set; }
}
}
,
问题是一个简单的语法问题。以这种方式定义输入函数时,输入变量需要用括号括起来。
它通过改变这个来工作:
Property="pen => pen.PenNumber"
为此:
Property="(pen) => pen.PenNumber"