Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Blazor OnChange事件_C#_Html_Blazor - Fatal编程技术网

C# Blazor OnChange事件

C# Blazor OnChange事件,c#,html,blazor,C#,Html,Blazor,我希望绑定到该值,并在更改后激发CalculateStandardDimensions方法。我已经尝试了几种不同的语法组合,但我仍然缺少一些使这项工作有效的东西。 保留输入不会执行该方法 如何绑定值并在值更改时调用方法 <input class="form-control form-control-sm" type="number" step="any" @bind-value:event="onchange=Calcu

我希望绑定到该值,并在更改后激发CalculateStandardDimensions方法。我已经尝试了几种不同的语法组合,但我仍然缺少一些使这项工作有效的东西。 保留输入不会执行该方法

如何绑定值并在值更改时调用方法

<input class="form-control form-control-sm" type="number" step="any" @bind-value:event="onchange=CalculateStandardDimensions()" @bind-value="Cyclone.CycloneSize" />

这看起来是一个简单的任务,但是有一些事情需要考虑。< /P> 在Blazor中,从输入到模型的通道通过事件处理。如果您使用@bind-syntax,编译器将为您构建处理程序。因此,您无法轻松地同时更新模型值和执行另一个处理程序

然而,有一些方便的方法可以实现你想要的。但它们也有缺点。根据你的背景,你需要决定什么是最好的

使用不同的事件

通过在属性size中引入字段_size,您可以绑定,size的setter将调用CalculateStandardDimensions。根据绑定onInput或onChange的事件,您可以控制写回的时间

您可以完全控制绑定,并且可以避免不一致性。但是,您已经引入了一个新的字段和属性。这需要为您希望具有这种行为的每个属性执行

使用不带绑定的中介属性

EditContext是在与Model属性一起使用和EditForm时隐式创建的,它有一个事件,在将值写回模型时触发该事件。我们通过显式创建EditContext并订阅事件来使用它。不要忘记稍后删除处理程序。这就是我们实现IDisposable的原因。事件处理程序本身检查字段是否是我们期望的字段,并执行方法CalculateStandardDimensions。HTML输入元素需要替换为InputNumber以使绑定工作


这种方法有很大的灵活性,但也有更多的复杂性。但是,您可以将它用于每个输入组件,如InputText或InputSelect。

我尝试了EditContext选项的代码,但当值更改时,事件不会触发。我从模板中创建了一个新的Blazor服务器应用程序,然后添加了上面的代码,但是没有触发OnFormUpdate。由于我猜这是一个小问题,所以我对这个选项进行了更多的研究。一个小副本和过去的错误取代了感谢您的帮助。我刚刚弄明白了这一点,然后回来发布我的发现。我将不得不阅读更多关于为什么绑定会以这种方式工作的内容。再次感谢!非常感谢您的回答。
    private void CalculateStandardDimensions()
    {
        // Do Stuff Here
    }
@page "/DifferentEvents"

<input class="form-control form-control-sm" type="number" step="any" 
       @bind-value:event="onchange" @oninput="CalculateStandardDimensions"  @bind-value="Cyclone.CycloneSize" />

@code
{
    public class Cyclon
    {
        public Int32 CycloneSize { get; set; } = 10;
    }

    public Cyclon Cyclone = new Cyclon();

    private void CalculateStandardDimensions(ChangeEventArgs args)
    {
        // Do Stuff Here
    }

}
@page "/IntermediatePropertyWithBinding"

<input class="form-control form-control-sm" type="number" step="any" @bind-value:event="onInput" @bind-value="Size" />

@code
{
    public class Cyclon
    {
        public Int32 CycloneSize { get; set; } = 10;
    }

    public Cyclon Cyclone = new Cyclon();

    private Int32 _size;

    public Int32 Size
    {
        get => _size;
        set
        {
            _size = value;
            CalculateStandardDimensions();
            Cyclone.CycloneSize = value;
        }
    }

    private void CalculateStandardDimensions()
    {
        // Do Stuff Here
    }
}

@page "/IntermediatePropertyWithoutBinding"

<input class="form-control form-control-sm" type="number" step="any" value="@_size" @oninput="ValueChanged" />

@code
{
    public class Cyclon
    {
        public Int32 CycloneSize { get; set; } = 10;
    }

    public Cyclon Cyclone = new Cyclon();

    private Int32 _size;

    private void ValueChanged(ChangeEventArgs args)
    {
        _size = Convert.ToInt32((String)args.Value);
        Cyclone.CycloneSize = _size;
        CalculateStandardDimensions();
    }

    private void CalculateStandardDimensions()
    {
        // Do Stuff Here
    }
}
@page "/WithEditContext"
@implements IDisposable

<EditForm EditContext="_editContext">
    <InputNumber class="form-control form-control-sm" type="number" step="any" @bind-Value:event="onchange" @bind-Value="Cyclone.CycloneSize" />
</EditForm>

@code
{
    public class Cyclon
    {
        public Int32 CycloneSize { get; set; } = 10;
    }

    private EditContext _editContext;

    public Cyclon Cyclone = new Cyclon();

    protected override void OnInitialized()
    {
        base.OnInitialized();

        _editContext = new EditContext(Cyclone);
        _editContext.OnFieldChanged += OnFormUpdated;
    }

    public void Dispose()
    {
        _editContext.OnFieldChanged -= OnFormUpdated;
    }

    private void OnFormUpdated(Object sender,  FieldChangedEventArgs args)
    {
        if(args.FieldIdentifier.FieldName == nameof(Cyclon.CycloneSize))
        {
            CalculateStandardDimensions();
        }
    }

    private void CalculateStandardDimensions()
    {
    }
}