【发布时间】:2019-04-21 04:39:28
【问题描述】:
当我的 ViewModel 的一个属性更新时,其他属性会异步更新。
Todo.cshtml:
@page "/todo"
<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>
<ul>
@foreach (var todo in todos)
{
<li>
<input type="checkbox" bind="@todo.IsDone" />
<input bind="@todo.Title" />
</li>
}
</ul>
<input placeholder="Something todo" bind="@newTodo"/>
<button onclick="@AddTodo">Add todo</button>
@functions {
IList<TodoItem> todos = new List<TodoItem>();
string newTodo;
void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
TodoItem.cs:
public class TodoItem
{
private bool _isDone;
public string Title { get; set; }
public bool IsDone
{
get => _isDone;
set
{
_isDone = value;
Task.Run(() =>
{
//Simulate work
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(2));
//Update property
Title = Title + " - Done";
});
}
}
}
在同步(没有 Task.Run)中,这可以正常工作,但在异步中,UI 不会更新。
我需要解释要使用StateHasChanged() 更新的 UI:
https://github.com/aspnet/Blazor/issues/1413
但我不能在 TodoItem 中调用此方法(而且我不希望 TodoItem 知道 Blazor 组件)。
你有更新 UI 的解决方案吗?
【问题讨论】:
-
为什么不在
TodoItem(如IsDoneComplete)中添加一个回调事件/处理程序,类型为Action,以便您的视图注册以便调用StateHasChanged? -
是的,我认为我的虚拟机需要更新视图或通知视图。