【问题标题】:Passing property delegate into Blazor component giving 'does not take 1 argument' error将属性委托传递给 Blazor 组件给出“不接受 1 个参数”错误
【发布时间】:2021-05-14 02:11:52
【问题描述】:

我正在尝试将属性作为委托传递给 Blazor 组件。但是,我收到 Delegate 'Func<Pen, int, stirng>' does not take 1 argument 错误。并且不确定正确的语法应该是什么。

这是组件:

@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; }
}

【问题讨论】:

  • 能贴一下 Pen 类的代码吗?

标签: delegates blazor


【解决方案1】:

您报告的错误是 Delegate 'Func&lt;Pen, int, string&gt;' does not take 1 argument,而Property 定义为Func&lt;TItem, string&gt;

Func&lt;TItem, string&gt; Property 说我想要一个看起来像这样的函数:

string MyMethod(TItem item)

您的匿名函数是pen =&gt; pen.PenNumber,属性期望pen.PenNumber 作为字符串。是吗?

这是您所做工作的简化工作版本:

TextBox.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; }
    }
}

【讨论】:

  • 嗨@MrCakaShaunCutis,虽然您的解决方案确实有效,但它违背了使其通用的目的。例如说我有多个列表,它们都具有不同类型的不同属性(我确实有)。那么您的解决方案将不起作用。但我真的很感激一个可行的答案,并会投票给你。
  • 如果我正确阅读了您的评论,只需将[Parameter] public Func&lt;TItem, string&gt; Property { get; set; } 更改为[Parameter] public Func&lt;TItem, object&gt; Property { get; set; },传递的值可以是任何值。
【解决方案2】:

问题是一个简单的语法问题。以这种方式定义输入函数时,输入变量需要用括号括起来。

通过改变它起作用了:

Property="pen => pen.PenNumber" 

到这里:

Property="(pen) => pen.PenNumber" 

【讨论】:

  • 没有复制。
  • @HenkHolterman 你能解释一下你的意思吗?
  • ( ) 没有区别。你得出了一个错误的结论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2021-01-18
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多