RadzenDataGrid中RowExpand事件异常:绑定后无法展开详情
问题:RadzenDataGrid绑定RowExpand事件后详情视图无法展开
我尝试为RadzenDataGrid绑定RowExpand事件以获取行的展开/折叠状态,核心代码如下:
<RadzenDataGrid @ref="grid" RowExpand="RowExpanded" .../> <Template> ... </Template> <Columns> ... </Columns> </RadzenDataGrid> .... void RowExpanded(ItemType item) { //OpenRow = item.id; }
调试确认事件可成功触发,但即使事件内无任何逻辑,也会导致数据表格的详情视图完全无法打开;移除RowExpand事件处理程序后,表格恢复正常功能。Radzen在线演示中该功能正常,但未发现自身代码与演示的差异。
简化复现代码
模型代码
public class Testmodel { public int Id { get; set; } public string Name { get; set; } public Testmodel(int id, string name) { Id = id; Name = name; } }
Blazor页面代码
@page "/Testseite" <h3>Testpage</h3> <RadzenDataGrid @ref="grid" AllowFiltering="true" AllowPaging="true" PageSize="3" AllowSorting="true" ExpandMode="DataGridExpandMode.Single" Data="@Datasets" TItem="Testmodel" RowExpand="RowExpand"> <Template Context="ModelDetail"> <RadzenStack> <RadzenText>Id: @ModelDetail.Id</RadzenText> <RadzenText>Name: @ModelDetail.Name</RadzenText> </RadzenStack> </Template> <Columns> <RadzenDataGridColumn TItem="Testmodel" Property="Id" Title="Id" Filterable="true" /> <RadzenDataGridColumn TItem="Testmodel" Property="Name" Title="Name" Filterable="true" /> </Columns> </RadzenDataGrid> @if(SelectedId.HasValue) { <RadzenText>SelectedId: @SelectedId.Value</RadzenText> } @code { RadzenDataGrid<Testmodel> grid; int? SelectedId = null; private List<Testmodel> Datasets { get { List<Testmodel> models = new List<Testmodel>(); models.Add(new Testmodel(1, "ABC")); models.Add(new Testmodel(2, "DEF")); models.Add(new Testmodel(3, "XYZ")); return models; } } void RowExpand(Testmodel model) { SelectedId = model.Id; } }
问题原因与修复方案
问题根源
问题出在**Datasets属性的实现方式**:你将其定义为每次访问都会返回全新List对象的getter。当RowExpand事件触发后,SelectedId更新会引发组件重渲染,此时DataGrid的数据源会被替换成新的集合。RadzenDataGrid会认为数据完全变更,重置所有行的展开状态;同时新集合中的对象与之前的引用不同,导致展开的行无法匹配,最终详情视图无法显示。
修复方案
将Datasets改为初始化一次的字段,避免每次重渲染都生成新集合:
@code { RadzenDataGrid<Testmodel> grid; int? SelectedId = null; // 改为字段,仅初始化一次 private List<Testmodel> Datasets = new List<Testmodel> { new Testmodel(1, "ABC"), new Testmodel(2, "DEF"), new Testmodel(3, "XYZ") }; void RowExpand(Testmodel model) { SelectedId = model.Id; } }
如果需要动态生成数据,建议在组件初始化生命周期方法(如OnInitializedAsync)中生成一次,而非在getter中重复创建新集合。
内容的提问来源于stack exchange,提问作者Stef
相关产品推荐
相关产品推荐

