更新异步属性 - c#

更新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?

参考方案

您应该执行以下操作:

在您的课程中定义一个动作委托:

public event Action OnChange;

在这个类中,如下定义方法NotifyStateChanged()

private void NotifyStateChanged() => OnChange?.Invoke();

此方法触发OnChange事件。完成任何任务后,应从逻辑中调用此方法。
在您的待办事项组件中,将StateHasChanged方法添加到TodoItem类中使用的事件委托中,从而:

@functions
{
    protected override void OnInit()
    {
        state.OnChange += StateHasChanged;
    }
}

希望这可以帮助。如果是这样,请不要拒绝接受它作为答案

jQuery和Gridview更新面板不起作用 - c#

我必须按照某些给定条件实现gridview的闪烁:gridview row blinking based on some conditions我能够成功实现它,但是随后我被要求在5秒钟内自动刷新gridview,为此我使用了ajax更新面板和计时器,但随后出现如下新的JavaScript错误:码: <form id="form1" …

Div单击与单选按钮相同吗? - php

有没有一种方法可以使div上的click事件与表单环境中的单选按钮相同?我只希望下面的div提交值,单选按钮很丑代码输出如下:<input id="radio-2011-06-08" value="2011-06-08" type="radio" name="radio_date&#…

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

Asp.net发送信息表单到页面 - c#

我正在尝试使用弹出窗口中的新信息更新旧页面。到目前为止,我尝试过将结果保存在会话中Session["Data"] = DLvrijecampingplaatsen.SelectedItem; 然后当它达到Page_Load时,将其重新加载回旧页面if (Session["Data"] != null) { LBkies…

调整窗口大小时如何调整YouTube播放器的大小 - php

我想显示包含YouTube视频的弹出窗口。我的问题是当用户调整弹出窗口的大小时如何调整YouTube播放器的大小?弹出窗口的头部分PHP / HTML代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/…