c# - 异步更新属性
问题描述
当我的 ViewModel 的一个属性被更新时,其他属性被异步更新。
待办事项.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 不会更新。
我需要解释要更新的 UI StateHasChanged()
:
https ://github.com/aspnet/Blazor/issues/1413
但是我不能在 TodoItem 中调用这个方法(而且我不希望 TodoItem 知道 Blazor 组件)。
您有更新 UI 的解决方案吗?
解决方案
您应该执行以下操作:
在你的类中定义一个动作委托:
public event Action OnChange;
在这个类中定义一个方法
NotifyStateChanged()
如下:private void NotifyStateChanged() => OnChange?.Invoke();
此方法触发
OnChange
事件。在完成它所做的任何任务后,您应该从您的逻辑中调用此方法。在你的 todo 组件中,将
StateHasChanged
方法添加到你的类中使用的事件委托中TodoItem
:@functions { protected override void OnInit() { state.OnChange += StateHasChanged; } }
推荐阅读
- django - 使用 prefetch_related 过滤没有子对象的父对象
- c++ - Clang 不允许在默认参数之后使用可变参数,gcc 允许
- reactjs - 摩纳哥编辑器 deltaDecorations 更改整个文本的样式,而不仅仅是给定范围
- ssis - 当 Fact 表中的记录发生变化时该怎么办?
- r - 使用 lapply 将 R 中的两个矩阵列表相乘
- azure - 在 Azure DevOps 中关闭项目
- javascript - Node.js Handlebars 将数据从 mySQL 数据库显示到引导模式
- windows - 更改了phpmyadmin密码,现在我无法进入
- flutter - 使用 Flutter 将自定义屏幕投射到 Chromecast
- javascript - 使用 Redux Toolkit 连接 Redux Store