如何在 Blazor 中将 EventHandler 作为参数传递

问题描述 投票:0回答:2

尝试将 EventHandler 传递给 Blazor 组件。我收到的错误: 事件 AppState.IntegerChanged 只能出现在 +=

的左侧

看起来这应该可行,这是 blazor 的限制还是我做错了什么?

在 MixedNumber.razor 尝试将事件分配给 ValueChanged 时出现编译器错误。

谢谢

MixedNumber.razor

@inject AppState AppState      
      
<CustomInput [email protected]> </CustomInput>
<CustomInput [email protected]> </CustomInput>
<CustomInput [email protected]> </CustomInput>

@code {
    [Parameter] public EventHandler<CustomValidationResult> ValueChanged { get; set; }

    public void MixedValueChanged()
    {
        CustomValidationResult result = new() { Integer = 1, Numerator = 10, Denominator = 100 };
        AppState.OnMixedChanged(result);
    }

    public class CustomValidationResult
    {
        public double Integer { get; set; }
        public double Numerator { get; set; }
        public double Denominator { get; set; }
    }
}

自定义输入.razor

@code {
    [Parameter] public EventHandler<double>? ValueChanged { get; set; }

    protected override void OnInitialized()
    {
        base.OnInitialized();
        ValueChanged += valueChanged;
    }

    public void valueChanged(object sender, double newValue)
    {
        //do something
    }

}

AppState.cs

public class AppState
{
    public static event EventHandler<double>? IntegerChanged;
    public static event EventHandler<double>? NumeratorChanged;
    public static event EventHandler<double>? DenominatorChanged;

    public static void OnMixedChanged(MixedNumber.CustomValidationResult result)
    {
        IntegerChanged?.Invoke(new object(), result.Integer);
        NumeratorChanged?.Invoke(new object(), result.Numerator);
        DenominatorChanged?.Invoke(new object(), result.Denominator);
    }

}
c# blazor parameter-passing blazor-webassembly eventhandler
2个回答
4
投票

这是 blazor 的限制吗

没有。

还是我做错了什么?

是的。

public static event EventHandler<double>? IntegerChanged;

event
是一种特殊的属性,只是更严格。它甚至不允许读取访问,只能使用
+=
-=
进行(取消)订阅。它可以保护作为值类型的底层委托的滥用。

当您只需删除

event
关键字时,您的代码将按原样进行编译。但它不会起作用,因为你订阅了委托的副本。当您认为这令人困惑时:这就是发明
event
机制的原因。

Blazor 有一个强有力的准则,反对从内部设置

[Parameter]

现在寻求解决方案:我认为这里不需要

event
。就简单多了。

给 CustomInput 一个 Value 属性,你就完成了。您可以使用 OnParameterSet() 对值更改做出反应。由于它是一个输入,您可能需要包含一个回调。

@code {
    [Parameter] 
    public double Value { get; set; } // don't use the set in this file

    [Parameter] 
    public EventCallback<double> ValueChanged { get; set; } // same

    ...  ValueChanged.InvokeAsync(localValue);
}
@inject AppState AppState      
      
<CustomInput @[email protected]> </CustomInput>

// or:

<CustomInput [email protected] ValueChanged=AppState.NumeratorChanged > </CustomInput>


-1
投票
[Parameter] public EventHandler<double>? ValueChanged { get; set; }

定义委托模式

Task MethodName(double value)
。任何符合此模式的方法都可以分配给组件声明中的参数。

但是您正在尝试为其分配一个事件。您正在尝试将两个公插座插在一起。两者都是事件的生成者,而不是接收者。

由于从提供的代码片段中尚不清楚您的意图,我只能说 - 是时候重新思考了。

© www.soinside.com 2019 - 2024. All rights reserved.