将属性委托传递给 Blazor 组件,给出“不接受 1 次争论”错误

问题描述

我试图将一个属性作为委托传递给一个 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"