【问题标题】:How to read a checkbox's @onclick event after the value如何在值之后读取复选框的 @onclick 事件
【发布时间】:2021-11-05 16:09:35
【问题描述】:

当我将@onclick 中的函数用于复选框并检查@bind-Value 的输入时,返回的值不同,看起来@onclick 事件比@bind-Value 先执行

跟随示例

<div>
    <MudCheckBox @bind-Checked="@testCheck" Color="Color.Secondary" @onclick="()=> ChecktestBox()"></MudCheckBox>
    <p>Value: @testCheck</p>
</div>

@code {
    private bool testCheck { get; set; } = false;
    
    private void ChecktestBox() {
        MessageBox.Show(testCheck.ToString());
        
        if(testCheck)
            ....
    }
}

结果是@onclick事件中添加的函数即使值为true也返回false

并且在使用的消息中Value: @testCheck 正确返回了值

我应该怎么做,从正确的@testCheck值开始

【问题讨论】:

  • 对 MudBlazor 不太熟悉,但有几个事件正在发生。 Blazor 绑定进程绑定到onchange,它实际上更新了TestCheck 的值。我没有安装 mudblazor 来检查执行顺序,但我猜 onclickonchange 之前执行。如果您想要在 testCheck 更改时发生事件,请将其放入 testChecks 设置器中。
  • 您也可以尝试oninput 事件。它可能适用于复选框并返回新值,但我还没有测试过!

标签: c# razor blazor


【解决方案1】:

我不使用 MudCheckBox,但我可以说,在我的正常实践中,没有一点双向绑定到复选框的 Value 或 Checked 属性。那是因为 onchange 事件 Value 提供了该属性。如果它不是字符串,则必须强制转换 ChangeEventArgs 才能读取该值。

<input type="checkbox" @onchange="HandleCheck" />
@Message

@code {
    string Message;

    void HandleCheck(ChangeEventArgs arg)
    {
        bool IsChecked = (bool)arg.Value;
        Message = IsChecked ? "Use this value" : "Don't use this value";
    }
}

如果我想要设置的类中有 b​​ool 属性,我通常只会使用 2 路绑定。

【讨论】:

  • 使用输入有效,但使用 Mud CheckBox 无效
  • 我非常不喜欢使用第 3 方组件。在 Blazor 中制作我自己的自定义复选框(例如)非常容易,除非它是非常复杂的东西(如 HTML 编辑器),否则不值得花时间弄清楚其他人的东西是如何工作的。 SO也很烦人,因为我必须安装库才能查看问题所在或尝试帮助您。话虽如此。 . .我会尝试另一种方法。
【解决方案2】:

假设 Mud CheckBox 已成功绑定到布尔值,那么您可以为其使用自定义 get; set;。但是,要小心处理它 - 你可能不想用它打电话给相关的async Task

<input type="checkbox" @bind="CheckTest"/>
@Message

@code {
    string Message;

    private bool _checkTest;
    bool CheckTest
    {
        get { return _checkTest; }
        set { _checkTest = value; HandleCheck(value);  }
    }

    void HandleCheck(bool IsChecked)
    {
        Message = IsChecked ? "Do something" : "Don't do the thing";
    }
}

不过,我有点难以相信 Mud 复选框无法正确处理 @onchange

【讨论】:

  • 有趣的方法现在似乎奏效了。我也不喜欢使用第三方组件,但是有些东西我喜欢google材料网的风格,我什至想过直接使用web的东西而不是一些第三方的,但是我没有找到任何东西谈谷歌对 blazor 的材料网支持
  • @Brian Brince 我建议采用 .css 或您喜欢的其他样式创意,然后自己制作一个组件。
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多