Ale*_*dre 4 blazor blazor-server-side blazor-client-side
我正在研究一些付费的网格组件,它们有一个非常酷的“绑定列”技术:
<TelerikGrid Data=@GridData>
<GridColumns>
<GridColumn Field="TemperatureC" Title="Temp. C" />
<GridColumn Field="Summary" />
</GridColumns>
<GridToolBar>
<GridCommandButton Command="Add" Icon="add">Add Forecast</GridCommandButton>
</GridToolBar>
</TelerikGrid>
<DxDataGrid Data="@DataSource">
<DxDataGridColumn Field="@nameof(ProductFlat.Id)">
</DxDataGridColumn>
<DxDataGridColumn Field="@nameof(ProductFlat.Category)">
</DxDataGridColumn>
</DxDataGrid>
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我想创建一个非常基本的表:
<MyGrid DataSource=@MySource>
<MyColumn Field="Id" Name="My Id" />
</MyGrid>
Run Code Online (Sandbox Code Playgroud)
渲染:
<table class="table">
<thead>
<tr>
<th scope="col">My Id</th>
</tr>
</thead>
<tbody>
<tr>
<td>#1</td>
</tr>
<tr>
<td>#2</td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
dan*_*era 12
这不是一个简单的解决方案,您应该了解 Blazor 如何处理组件。基本上,方法是MyColumn在外部MyGrid组件上注册子“模板” ,然后通过一点反射动态渲染网格。下面我发布了准备复制粘贴、测试和学习的食谱。
dotnet new blazorserver
Run Code Online (Sandbox Code Playgroud)
Pages/MyColumn.razor组件:@code {
[Parameter]
public string Field { get; set; }
[CascadingParameter]
private MyGrid Parent { get; set; }
protected override void OnInitialized()
{
base.OnInitialized();
Parent.AddColumn(this); //register child into parent
}
}
Run Code Online (Sandbox Code Playgroud)
Pages/MyGrid.razor组件:<CascadingValue Value="this">
<table class="table">
<tbody>
@ChildContent
@foreach (var item in DataSource)
{
@RowItem(item)
}
</tbody>
</table>
</CascadingValue>
@code {
[Parameter]
public RenderFragment ChildContent { get; set; }
[Parameter]
public IEnumerable<object> DataSource { get; set; }
List<MyColumn> Columns = new List<MyColumn>();
public void AddColumn(MyColumn column)
{
Columns.Add(column);
StateHasChanged();
}
Run Code Online (Sandbox Code Playgroud)
// Here the function to create each row dynamically:
private RenderFragment RowItem(object row)
{
int i = 0;
return b => // create dynamically
{
b.OpenElement(++i, "tr");
foreach(var column in Columns)
{
b.OpenElement(++i, "td");
var val = row.GetType().GetProperty(column.Field)
.GetValue(row, null).ToString();
b.AddContent(++i,val);
b.CloseElement();
}
b.CloseElement();
};
}
}
Run Code Online (Sandbox Code Playgroud)
Pages/FetchData.razor@page "/fetchdata"
@using s.Data
@inject WeatherForecastService ForecastService
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from a service.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<MyGrid DataSource=@forecasts>
<MyColumn Field="Date"/>
<MyColumn Field="Summary"/>
</MyGrid>
}
@code {
private WeatherForecast[] forecasts;
protected override async Task OnInitializedAsync()
{
forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1599 次 |
| 最近记录: |