刷新UI以反映添加到列表中的项目

本文关键字:列表 项目 添加 UI 刷新 | 更新日期: 2023-09-27 18:03:45

显示UI时,数据在后端传递并添加到我想在UI上显示的List<string>中。

我见过几个使用后台工作器的例子,但是由于我如何布局我的用户控件并以编程方式构建它们,我无法访问实际的组件。

问题:我如何在我的UI后面重复运行这个方法而不将我的UI锁定在循环中?

public void UpdatePanel()
{
    foreach (var item in list)
    {
        AddMethod(item);
    }
}

刷新UI以反映添加到列表中的项目

代替使用循环或时间间隔来监视列表,作为可能的选项,您可以使用BindingList<T>ObservableCollection<T>并在列表更改时接收通知。

然后您可以在事件处理程序中更新用户界面,您附加到BindingList<T>ListChanged事件或ObservableCOllection<T>CollectionChanged事件。

下面是一个基于ObservableCollection<string>的示例。

ObservableCollection<string> list;
private void Form1_Load(object sender, EventArgs e)
{
    list = new ObservableCollection<string>();
    list.CollectionChanged += list_CollectionChanged;
    list.Add("Item 1");
    list.Add("Item 2");
    list.RemoveAt(0);
    list[0] = "New Item";
}
void list_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.Action == NotifyCollectionChangedAction.Add)
    {
        var items = string.Join(",", e.NewItems.Cast<String>());
        MessageBox.Show(string.Format("'{0}' Added", items));
    }
    else if (e.Action == NotifyCollectionChangedAction.Remove)
    {
        var items = string.Join(",", e.OldItems.Cast<String>());
        MessageBox.Show(string.Format("'{0}' Removed", items));
    }
    else if (e.Action == NotifyCollectionChangedAction.Replace)
    {
        var oldItems = string.Join(",", e.OldItems.Cast<String>());
        var newItems = string.Join(",", e.NewItems.Cast<String>());
        MessageBox.Show(string.Format("'{0}' replaced by '{1}'", oldItems, newItems));
    }
    else
    {
        MessageBox.Show("Reset or Move");
    }
}

你可以使用Task, Async和await,其中有一些代码,每秒在列表框中插入一个元素,而不会阻塞UI。

在您的例子中,您必须从后端异步返回数据。

    public async void LoadItemsAsync()
    {
        for (int i = 0; i < 10; i++)
            listBox1.Items.Add(await GetItem());
    }
    public Task<string> GetItem()
    {
        return Task<string>.Factory.StartNew(() =>
        {
            Thread.Sleep(1000);
            return "Item";
        });
    }