我正在Blazor中做一个Modal组件,用于编辑网格记录。如果用户单击我的按钮,我想用当前选择的记录来呈现它。
我使用函数ViewProvider
创建了一个名为Edit(T current)
的帮助程序类,其中T
是代表我的记录的类。编辑函数返回RenderFragment
然后我将@ViewProvider.Edit(Current)
放在我的Grid.razor
中,我打算在其中显示模式窗口。每当网格更改其状态时都称为它。但是,该模态将仅弹出一次,并且在单击按钮后不会重新呈现新记录。我想Blazor在树中内部看到了我的模态,并且认为没有任何变化,因为视图是相同的(尽管视图中的数据是不同的)。
如何在每次单击按钮时强制Modal与当前记录一起显示?或者如何更改RenderFragment的一部分以更新视图中的数据?
编辑:
代码如下:
Grid.razor
@if (EditedCell.HasValue) {
@ViewProvider.Edit(Current, "Edit")
}
ViewProvider.cs
public override RenderFragment Edit(T current, string modalName)
{
RenderFragment editView = (builder) =>
{
foreach (var property in typeof(T).GetProperties())
{
builder.OpenElement(0, "div");
builder.AddAttribute(1, "class", "mt10 mb10");
builder.OpenElement(2, "label");
builder.AddContent(3, property.Name);
builder.CloseElement();
builder.OpenComponent<InputBox>(4);
builder.AddAttribute(5, "Type", InputBox.SetInputType(property.PropertyType));
builder.AddAttribute(6, "Value", property.GetValue(current).ToString());
builder.AddAttribute(7, "Class", "right");
builder.CloseComponent();
builder.CloseElement();
}
builder.OpenElement(8, "button");
builder.AddAttribute(9, "class", "primary");
builder.AddAttribute(10, "onclick", EventCallback.Factory.Create<MouseEventArgs>(this, s => { EditOnClick(current, s); }));
builder.AddContent(11, "Zapisz");
builder.CloseElement();
};
return AddModal(editView, modalName);
}
public RenderFragment AddModal(RenderFragment ChildContent, string modalName)
{
RenderFragment modalFragment = (builder) =>
{
builder.OpenComponent<Modal>(0);
builder.AddAttribute(1, "Name", modalName);
builder.AddAttribute(2, "ChildContent", ChildContent);
builder.CloseComponent();
};
return modalFragment;
}