Blazor中MudSelect的onchange/onclick事件无法触发问题求助
MudSelect无法触发DoStuff函数的问题修复
问题根源
- 混用@bind-Value和@onchange无效:MudSelect的
@bind-Value是语法糖,已经封装了Value绑定和ValueChanged事件逻辑,手动添加原生@onchange不会被触发,组件内部的事件处理会覆盖它。 - RowTemplate内嵌套@code块错误:Blazor组件的
@code必须放在最外层,你在RowTemplate里写的@code块完全无效,里面定义的DoStuff根本不会被调用,还和外层的同名函数冲突。 - Value绑定语法错误:你后来改成的
Value="rcontext.Severity"没加@符号,这会把字符串"rcontext.Severity"赋值给组件,而不是绑定到rcontext.Severity变量。 - MudSelectItem不需要绑定@onchange:选择项的点击事件由MudSelect统一处理,单独给选项加事件完全多余,也不会生效。
修正后的代码方案
把Severity列的MudSelect改成以下写法,同时移除RowTemplate内的无效@code块,统一在外层@code里定义正确的DoStuff函数:
<MudTd Style="text-align: right" DataLabel="Severity"> <MudSelect Dense="true" T="string" Label="Severity" Variant="Variant.Filled" Placeholder="Please Select" Required="true" @bind-Value="rcontext.Severity" ValueChanged="(value) => DoStuff(rcontext, value)"> <MudSelectItem Value="@("Acceptable")" /> <MudSelectItem Value="@("Tolerable")" /> <MudSelectItem Value="@("Undesirable")" /> <MudSelectItem Value="@("Intolerable")" /> </MudSelect> </MudTd>
然后在外层@code里保留正确的DoStuff函数(删除RowTemplate内的@code块和重复的DoStuff定义):
void DoStuff(Questionnaire context, string selectedString) { context.Severity = selectedString; Console.WriteLine("选中的值是: " + selectedString); }
额外说明
- 如果不需要传递
rcontext,只需要获取选中值,也可以简化成:
对应的函数:<MudSelect ... @bind-Value="rcontext.Severity" ValueChanged="DoStuff">void DoStuff(string selectedString) { Console.WriteLine("选中的值是: " + selectedString); } - 确保
Questionnaire类的Severity属性是可读写的(有get和set方法),否则绑定和值更新都会失效。
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

