异步加载 ListView

Loading ListView asynchronously

我正在尝试使用我的数据库中的数据加载我的列表视图。 并且数据会定期更新。

<ListView Margin="10" Name="lvDataBinding" ></ListView> //frontend

我现在正在尝试使用 backgroundworker 加载新数据,但没有成功

     <ListView Margin="10" Name="lvDataBinding" ></ListView> //frontend

    ObservableCollection<string> mNames = new ObservableCollection<string>(); 


public SettingsControl()
            {
                InitializeComponent();

                listview1.ItemsSource = mNames;
                mNames.Add("1");
                var mWorker = new BackgroundWorker();
                mWorker.DoWork += Worker_ListenForNewSMS;
                mWorker.RunWorkerAsync();


        }

    private void Worker_ListenForNewSMS(object sender, DoWorkEventArgs e)
            {
                while (true)
                {
                    Thread.Sleep(2000);
                    //fetch and load new data here, cant seems to work
                   listview1.ItemsSource = "NEWDATA";


                }
            }

怎么会异步重新加载数据,我不想刷新页面。

我需要它处于循环状态,这样我就可以收听 ddatabase,如果有新条目,它将更新列表

我知道数据盲化,但我在这方面的经验很少,谁能提供一个例子来指导我。

因为 ListViewItemsSource 已经配置好,所以使用以下代码刷新数据的最佳方式:

mNames.Clear();
// Now add the ite,
mNames.Add("item1");
mNames.Add("item2");

额外的想法

您在 ObservableCollection 上实现了 AddRange 方法,因此可以将以上多个语句转换为 mNames.AddRange(<Collection Object>)。按照这个 link 来实现 AddRange。

// 备选方案

如果您尝试更新 ItemsSource,那么您应该手动刷新视图。假设您需要在所有元素都添加到 ItemsSource 后更新一次)因此您应该使用这种方法:

// Create the view.
ICollectionView view = CollectionViewSource.GetDefaultView(mNames);

// To Refresh calls like this.
view.Refresh();

我更喜欢选项 1。

使用调度程序将新数据添加到源集合:

private void Worker_ListenForNewSMS(object sender, DoWorkEventArgs e)
{
    while (true)
    {
        Thread.Sleep(2000);
        Dispatcher.BeginInvoke(new Action(() =>
        {
            mNames.Add("NEWDATA");
        }));
    }
}

调度程序将调用编组回 UI 线程。这是必需的,因为您只能在 UI 线程上更新数据绑定集合(除非您使用 BindingOperations.EnableCollectionSynchronization 方法)。

如果您出于某种原因要重新设置 ItemsSource 属性:

,您还需要使用调度程序
private void Worker_ListenForNewSMS(object sender, DoWorkEventArgs e)
{
    while (true)
    {
        Thread.Sleep(2000);
        Dispatcher.BeginInvoke(new Action(() =>
        {
            listview1.ItemsSource = new List<string> { "NEWDATA" };
        }));
    }
}

不能从后台线程设置UI控件的属性。

最后我用 observableCollection 加载列表视图

并使用按钮触发刷新功能