如何在同一布局的if语句下复用Radzen DataGrid并动态指定TItem?
复用Radzen DataGrid的可行方案
Radzen DataGrid的TItem是编译时确定的泛型参数,无法通过字符串动态指定,但可以通过以下几种方式实现单表格复用,避免重复编写代码:
1. 基于基类/接口统一类型
如果三个场景的数据类存在共同属性,定义一个基类或接口让它们继承/实现,将TItem指定为这个基类/接口,再通过切换Data绑定的数据源实现复用:
步骤1:定义通用接口/基类
// 定义包含所有表格需展示属性的接口 public interface IGridItem { int Id { get; set; } string DisplayName { get; set; } DateTime CreateTime { get; set; } } // 三个场景的数据类实现该接口 public class Order : IGridItem { /* 实现接口属性 + 订单专属属性 */ } public class User : IGridItem { /* 实现接口属性 + 用户专属属性 */ } public class Product : IGridItem { /* 实现接口属性 + 商品专属属性 */ }
步骤2:页面中复用表格
<RadzenDataGrid @ref="gridRef" Data="@currentDataSource" TItem="IGridItem" AutoGenerateColumns="false"> <Columns> <RadzenDataGridColumn Property="Id" Title="ID" /> <RadzenDataGridColumn Property="DisplayName" Title="名称" /> <RadzenDataGridColumn Property="CreateTime" Title="创建时间" FormatString="yyyy-MM-dd" /> <!-- 根据当前场景显示专属列 --> @if (currentScenario == "Order") { <RadzenDataGridColumn Property="@nameof(Order.OrderNo)" Title="订单编号" /> } @if (currentScenario == "User") { <RadzenDataGridColumn Property="@nameof(User.Email)" Title="邮箱" /> } </Columns> </RadzenDataGrid> <!-- 场景切换按钮示例 --> <button @onclick="() => SwitchDataSource("Order")">显示订单</button> <button @onclick="() => SwitchDataSource("User")">显示用户</button> <button @onclick="() => SwitchDataSource("Product")">显示商品</button> @code { private RadzenDataGrid<IGridItem> gridRef; private IList<IGridItem> currentDataSource; private string currentScenario; // 切换数据源方法 private void SwitchDataSource(string scenario) { currentScenario = scenario; currentDataSource = scenario switch { "Order" => GetOrderList().Cast<IGridItem>().ToList(), "User" => GetUserList().Cast<IGridItem>().ToList(), "Product" => GetProductList().Cast<IGridItem>().ToList(), _ => new List<IGridItem>() }; gridRef.Reload(); } // 模拟获取各场景数据 private List<Order> GetOrderList() => /* 数据逻辑 */; private List<User> GetUserList() => /* 数据逻辑 */; private List<Product> GetProductList() => /* 数据逻辑 */; }
2. 使用动态类型(dynamic)
如果三个数据类没有共同属性,且表格列结构完全一致,可将TItem设为dynamic,通过Cast<dynamic>转换数据源实现复用。这种方式没有编译时类型检查,需确保各数据类的属性名称与列配置匹配:
<RadzenDataGrid @ref="gridRef" Data="@currentDataSource" TItem="dynamic" AutoGenerateColumns="false"> <Columns> <RadzenDataGridColumn Property="Id" Title="ID" /> <RadzenDataGridColumn Property="Name" Title="名称" /> <RadzenDataGridColumn Property="CreateDate" Title="创建日期" /> </Columns> </RadzenDataGrid> @code { private RadzenDataGrid<dynamic> gridRef; private IList<dynamic> currentDataSource; private void SwitchDataSource(string scenario) { currentDataSource = scenario switch { "A" => GetDataA().Cast<dynamic>().ToList(), "B" => GetDataB().Cast<dynamic>().ToList(), "C" => GetDataC().Cast<dynamic>().ToList(), _ => new List<dynamic>() }; gridRef.Reload(); } }
注意事项
- 基类/接口方式具备编译时类型检查,更安全,推荐优先使用;
- 动态类型方式适合快速实现,但属性名称不匹配时会运行时出错,需谨慎使用;
- 若列结构差异较大,可在
Columns内通过@if分支根据场景渲染对应列,无需拆分多个表格。
内容的提问来源于stack exchange,提问作者AsM
相关产品推荐
相关产品推荐

