MudTable 不是双向绑定吗?
MudTable not two way binding?
我对 Blazor 和 MudBlazor 还很陌生,我有一个奇怪的问题无法解决。不确定这是否会有所作为,但以防万一,我使用的是 Visual Studio 2022 17.1.3。我有一个显示对象列表的 MudTable。我想进行基本的 CRUD 操作,但在删除时遇到问题。我的逻辑相当简单,当点击删除按钮时,它会弹出一个 MudDialog 来确认删除。如果您单击对话框中的删除按钮,它会调用我的 DeleteUser 函数并传入 ID,这样我就可以删除,然后删除确认消息中使用的名称。当我完成整个过程并进行调试时,一切看起来都应该如此。我得到了 ID 和名称,我可以知道删除按钮已被单击,我可以从数据库中删除,我可以确认我列表中的记录数是一个值,然后在我将其从列表中删除后减去一条记录列表,但之后对话框将消失,MudTable 仍然显示原始记录,而不是显示已删除记录消失的新列表。更重要的是,如果我再次单击删除按钮,会弹出对话框(您仍然可以在背景中看到 table),然后第一个删除的记录就会消失,这应该已经发生了。这就像双向绑定件不起作用。真正让我着迷的是它最初是有效的。所以,也许我做了一些事情让它无法正常工作,但我没有看到任何看起来不对劲的地方。
我正在寻找任何建议。我花了几个小时试图解决这个问题,但没有取得任何进展。
<MudTable Items="@applications" Filter="new Func<AaApp, bool>(Search)" Hover="true" Bordered="true" Striped="true" Dense="true" >
<ToolBarContent>
<a class="btn btn-sm btn-success" @onclick="(e => CreateAsync())" >
<i class="fas fa-plus"></i> New
</a>
<MudSpacer />
<MudTextField @bind-Value="searchString" Placeholder="Search for an Application..." Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField>
</ToolBarContent>
<HeaderContent>
<MudTh>ID</MudTh>
<MudTh>
<MudTableSortLabel InitialDirection="SortDirection.Ascending" SortBy="new Func<AaApp, object>(x=>x.Name)">Application Name</MudTableSortLabel>
</MudTh>
<MudTh>Description</MudTh>
<MudTh></MudTh>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="ID">@context.Id</MudTd>
<MudTd DataLabel="Application Name">@context.Name</MudTd>
<MudTd DataLabel="Description">@context.Description</MudTd>
<MudTd DataLabel="">
<MudButton OnClick="@((e) => DeleteUser(@context.Id, @context.Name))" Variant="Variant.Filled" Color="Color.Error">Delete Records</MudButton>
</MudTd>
</RowTemplate>
<PagerContent>
<MudTablePager PageSizeOptions="new int[] { 5,10,25,50}" />
</PagerContent>
</MudTable>
@code {
private string searchString = "";
private List<AaApp> applications;
private AaApp application = new();
MudMessageBox msgBox { get; set; }
private async void DeleteUser(int id, string name)
{
var msgText = "Are you sure you want to delete: <b>" + name + "</b>.";
bool? result = await _dialogService.ShowMessageBox("Delete Confirmation",(MarkupString) msgText, yesText: "Delete", cancelText: "Cancel");
if (result ?? false)
{
//delete from database
db.DeleteApp(id);
//Remove and re-sort list.
applications.RemoveAll(i => i.Id == id);
applications = applications.OrderBy(a => a.Name).ToList();
}
}
protected override async Task OnInitializedAsync()
{
applications = await db.GetApps();
}
private async Task CreateAsync()
{
var parameters = new DialogParameters();
parameters.Add("application", new AaApp());
var dialog = await _dialogService.Show<AddOrUpdateDialog>("Creat A New App", parameters).Result;
if (dialog.Data != null)
{
AaApp newApp = dialog.Data as AaApp;
db.InsertApp(newApp);
NavigationManager.NavigateTo("Groups");
}
}
private bool Search(AaApp app)
{
if (app.Name is not null && app.Name.Contains(searchString, StringComparison.OrdinalIgnoreCase))
{
return true;
}
return false;
}
}
我在没有 MudDialog 的情况下尝试了您的代码,它工作正常。当我使用对话框时,我得到了相同的结果,所以我调用了 StateHasChanged 方法,一切正常。
applications.RemoveAll(i => i.Id == id);
applications = applications.OrderBy(a => a.Name).ToList();
StateHasChanged();
我对 Blazor 和 MudBlazor 还很陌生,我有一个奇怪的问题无法解决。不确定这是否会有所作为,但以防万一,我使用的是 Visual Studio 2022 17.1.3。我有一个显示对象列表的 MudTable。我想进行基本的 CRUD 操作,但在删除时遇到问题。我的逻辑相当简单,当点击删除按钮时,它会弹出一个 MudDialog 来确认删除。如果您单击对话框中的删除按钮,它会调用我的 DeleteUser 函数并传入 ID,这样我就可以删除,然后删除确认消息中使用的名称。当我完成整个过程并进行调试时,一切看起来都应该如此。我得到了 ID 和名称,我可以知道删除按钮已被单击,我可以从数据库中删除,我可以确认我列表中的记录数是一个值,然后在我将其从列表中删除后减去一条记录列表,但之后对话框将消失,MudTable 仍然显示原始记录,而不是显示已删除记录消失的新列表。更重要的是,如果我再次单击删除按钮,会弹出对话框(您仍然可以在背景中看到 table),然后第一个删除的记录就会消失,这应该已经发生了。这就像双向绑定件不起作用。真正让我着迷的是它最初是有效的。所以,也许我做了一些事情让它无法正常工作,但我没有看到任何看起来不对劲的地方。
我正在寻找任何建议。我花了几个小时试图解决这个问题,但没有取得任何进展。
<MudTable Items="@applications" Filter="new Func<AaApp, bool>(Search)" Hover="true" Bordered="true" Striped="true" Dense="true" >
<ToolBarContent>
<a class="btn btn-sm btn-success" @onclick="(e => CreateAsync())" >
<i class="fas fa-plus"></i> New
</a>
<MudSpacer />
<MudTextField @bind-Value="searchString" Placeholder="Search for an Application..." Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField>
</ToolBarContent>
<HeaderContent>
<MudTh>ID</MudTh>
<MudTh>
<MudTableSortLabel InitialDirection="SortDirection.Ascending" SortBy="new Func<AaApp, object>(x=>x.Name)">Application Name</MudTableSortLabel>
</MudTh>
<MudTh>Description</MudTh>
<MudTh></MudTh>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="ID">@context.Id</MudTd>
<MudTd DataLabel="Application Name">@context.Name</MudTd>
<MudTd DataLabel="Description">@context.Description</MudTd>
<MudTd DataLabel="">
<MudButton OnClick="@((e) => DeleteUser(@context.Id, @context.Name))" Variant="Variant.Filled" Color="Color.Error">Delete Records</MudButton>
</MudTd>
</RowTemplate>
<PagerContent>
<MudTablePager PageSizeOptions="new int[] { 5,10,25,50}" />
</PagerContent>
</MudTable>
@code {
private string searchString = "";
private List<AaApp> applications;
private AaApp application = new();
MudMessageBox msgBox { get; set; }
private async void DeleteUser(int id, string name)
{
var msgText = "Are you sure you want to delete: <b>" + name + "</b>.";
bool? result = await _dialogService.ShowMessageBox("Delete Confirmation",(MarkupString) msgText, yesText: "Delete", cancelText: "Cancel");
if (result ?? false)
{
//delete from database
db.DeleteApp(id);
//Remove and re-sort list.
applications.RemoveAll(i => i.Id == id);
applications = applications.OrderBy(a => a.Name).ToList();
}
}
protected override async Task OnInitializedAsync()
{
applications = await db.GetApps();
}
private async Task CreateAsync()
{
var parameters = new DialogParameters();
parameters.Add("application", new AaApp());
var dialog = await _dialogService.Show<AddOrUpdateDialog>("Creat A New App", parameters).Result;
if (dialog.Data != null)
{
AaApp newApp = dialog.Data as AaApp;
db.InsertApp(newApp);
NavigationManager.NavigateTo("Groups");
}
}
private bool Search(AaApp app)
{
if (app.Name is not null && app.Name.Contains(searchString, StringComparison.OrdinalIgnoreCase))
{
return true;
}
return false;
}
}
我在没有 MudDialog 的情况下尝试了您的代码,它工作正常。当我使用对话框时,我得到了相同的结果,所以我调用了 StateHasChanged 方法,一切正常。
applications.RemoveAll(i => i.Id == id);
applications = applications.OrderBy(a => a.Name).ToList();
StateHasChanged();