Blazor Server:Radzen下拉框切换后重新计算ProjectWipCalculations的方法
解决方案
1. 调整下拉框绑定与事件配置
修改RadzenDropDown,让它直接绑定CalendarPeriod2对象(而非仅字符串),这样能直接获取选中项的PeriodFrom,同时添加选中变更事件触发数据重新计算:
<div class="rz-p-12 rz-text-align-center"> <RadzenDropDown TValue="CalendarPeriod2" @bind-Value="@SelectedPeriod" Data="@CalendarPeriod2" TextProperty="GlPeriodOracle" Change="@OnPeriodChanged" /> </div>
2. 更新代码逻辑
在@code块中添加选中项变量,调整初始化逻辑,并实现变更事件处理:
@code { public IEnumerable<CalendarPeriod2> CalendarPeriod2 { get; set; } = null!; public CalendarPeriod2? SelectedPeriod { get; set; } // 假设ProjectWipCalculations是已定义的业务数据变量 public YourWipDataType? ProjectWipCalculations { get; set; } protected override async Task OnParametersSetAsync() { CalendarPeriod2 = await _db.GetCalendarPeriod2Async(); // 设置默认选中项为集合第一个元素 SelectedPeriod = CalendarPeriod2.FirstOrDefault(); if (SelectedPeriod != null) { // 初始化时用默认选中项的PeriodFrom计算数据 ProjectWipCalculations = await _db.GetCurrentMonthWIPData(projectList, SelectedPeriod.PeriodFrom); } } // 下拉框选中变更时触发的方法 private async Task OnPeriodChanged() { if (SelectedPeriod != null) { // 根据选中项的PeriodFrom重新计算数据 ProjectWipCalculations = await _db.GetCurrentMonthWIPData(projectList, SelectedPeriod.PeriodFrom); // 手动触发组件重新渲染(Blazor通常会自动处理,显式调用更保险) await InvokeAsync(StateHasChanged); } } }
关键修改说明
- 绑定对象而非字符串:将
TValue改为CalendarPeriod2,直接绑定整个对象,避免后续需要通过字符串查找对应实体的额外逻辑。 - 默认选中项设置:初始化时将
SelectedPeriod设为集合第一个元素,确保首次渲染有默认值并计算对应数据。 - 变更事件处理:通过
Change事件触发OnPeriodChanged方法,在方法内使用选中项的PeriodFrom重新调用数据接口,并手动触发组件渲染更新UI。
备选方案(若需保留字符串值绑定)
如果必须使用GlPeriodOracle作为下拉框的值类型,可按以下方式调整:
<RadzenDropDown TValue="string" @bind-Value="@SelectedGlPeriodOracle" Data="@CalendarPeriod2.Select(p => p.GlPeriodOracle)" Change="@OnPeriodChanged" />
@code { public string? SelectedGlPeriodOracle { get; set; } protected override async Task OnParametersSetAsync() { CalendarPeriod2 = await _db.GetCalendarPeriod2Async(); SelectedGlPeriodOracle = CalendarPeriod2.Select(p => p.GlPeriodOracle).FirstOrDefault(); if (SelectedGlPeriodOracle != null) { var selectedPeriod = CalendarPeriod2.First(p => p.GlPeriodOracle == SelectedGlPeriodOracle); ProjectWipCalculations = await _db.GetCurrentMonthWIPData(projectList, selectedPeriod.PeriodFrom); } } private async Task OnPeriodChanged() { if (SelectedGlPeriodOracle != null) { var selectedPeriod = CalendarPeriod2.First(p => p.GlPeriodOracle == SelectedGlPeriodOracle); ProjectWipCalculations = await _db.GetCurrentMonthWIPData(projectList, selectedPeriod.PeriodFrom); await InvokeAsync(StateHasChanged); } } }
这种方式需要通过选中的字符串去匹配对应的CalendarPeriod2对象,相比直接绑定对象多了一步查找操作,推荐优先使用第一种方案。
内容的提问来源于stack exchange,提问作者Baldie47
相关产品推荐
相关产品推荐

