尝试将 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);
}
}
这是 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>
[Parameter] public EventHandler<double>? ValueChanged { get; set; }
定义委托模式
Task MethodName(double value)
。任何符合此模式的方法都可以分配给组件声明中的参数。
但是您正在尝试为其分配一个事件。您正在尝试将两个公插座插在一起。两者都是事件的生成者,而不是接收者。
由于从提供的代码片段中尚不清楚您的意图,我只能说 - 是时候重新思考了。