异步加载ListView

时间:2018-05-21 04:42:18

标签: c# wpf listview backgroundworker

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

<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";


                }
            }

那么如何重新加载数据异步,我不想刷新页面。

我需要它在循环中以便我可以收听数据库,如果有新条目,它将更新列表

我知道数据致盲,但我很少有经验这样做,任何人都可以提供一个例子来指导我。

3 个答案:

答案 0 :(得分:0)

因为ItemsSource ListView已经配置好,所以最好使用以下代码刷新数据:

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

额外的Thogught

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

//替代解决方案

如果您尝试更新ItemsSource,则应手动刷新View。让我们假设您需要在将所有元素添加到ItemsSource后更新一次,因此您应该使用此方法:

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

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

我更喜欢选项1。

答案 1 :(得分:0)

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

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控件的属性。

答案 2 :(得分:0)

最后,我使用observableCollection

加载listview

并使用按钮触发刷新功能