首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步加载ListView

异步加载ListView
EN

Stack Overflow用户
提问于 2018-05-21 04:42:17
回答 3查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
<ListView Margin="10" Name="lvDataBinding" ></ListView> //frontend

我现在正在试验如何使用后台工作人员来加载新数据,但没有任何进展。

代码语言:javascript
复制
     <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,如果有新条目,它将更新列表。

我意识到数据盲目,但我很少有经验这样做,谁能提供一个例子来指导我这样做。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-21 16:47:37

最后,我用一个observableCollection加载列表视图

并使用按钮触发刷新函数。

票数 0
EN

Stack Overflow用户

发布于 2018-05-21 04:47:29

由于ItemsSource of ListView已经配置为使用以下代码刷新数据的最佳方法:

代码语言:javascript
复制
mNames.Clear();
// Now add the ite,
mNames.Add("item1");
mNames.Add("item2");

额外的梭格特

您可以在AddRange上实现ObservableCollection方法,因此上面的多个状态可以转换为mNames.AddRange(<Collection Object>)。遵循这个链接实现AddRange。

//替代解决方案

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

代码语言:javascript
复制
// Create the view.
ICollectionView view = CollectionViewSource.GetDefaultView(mNames);

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

我更赞成备选案文1。

票数 0
EN

Stack Overflow用户

发布于 2018-05-21 12:29:54

使用dispatcher将新数据添加到源集合:

代码语言:javascript
复制
private void Worker_ListenForNewSMS(object sender, DoWorkEventArgs e)
{
    while (true)
    {
        Thread.Sleep(2000);
        Dispatcher.BeginInvoke(new Action(() =>
        {
            mNames.Add("NEWDATA");
        }));
    }
}

dispatcher将调用发送回UI线程。这是必需的,因为您只能更新UI线程上的数据绑定集合(除非使用BindingOperations.EnableCollectionSynchronization )。

如果出于某种原因重新设置ItemsSource属性,还需要使用dispatcher:

代码语言:javascript
复制
private void Worker_ListenForNewSMS(object sender, DoWorkEventArgs e)
{
    while (true)
    {
        Thread.Sleep(2000);
        Dispatcher.BeginInvoke(new Action(() =>
        {
            listview1.ItemsSource = new List<string> { "NEWDATA" };
        }));
    }
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50442099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档