我正在尝试用数据库中的数据加载我的列表视图。数据将定期更新。
<ListView Margin="10" Name="lvDataBinding" ></ListView> //frontend我现在正在试验如何使用后台工作人员来加载新数据,但没有任何进展。
<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,如果有新条目,它将更新列表。
我意识到数据盲目,但我很少有经验这样做,谁能提供一个例子来指导我这样做。
发布于 2018-05-21 16:47:37
最后,我用一个observableCollection加载列表视图
并使用按钮触发刷新函数。
发布于 2018-05-21 04:47:29
由于ItemsSource of ListView已经配置为使用以下代码刷新数据的最佳方法:
mNames.Clear();
// Now add the ite,
mNames.Add("item1");
mNames.Add("item2");额外的梭格特
您可以在AddRange上实现ObservableCollection方法,因此上面的多个状态可以转换为mNames.AddRange(<Collection Object>)。遵循这个链接实现AddRange。
//替代解决方案
如果尝试更新ItemsSource,则应手动刷新视图。假设您需要在将所有元素添加到ItemsSource后一次更新它),因此您应该使用以下方法:
// Create the view.
ICollectionView view = CollectionViewSource.GetDefaultView(mNames);
// To Refresh calls like this.
view.Refresh();我更赞成备选案文1。
发布于 2018-05-21 12:29:54
使用dispatcher将新数据添加到源集合:
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:
private void Worker_ListenForNewSMS(object sender, DoWorkEventArgs e)
{
while (true)
{
Thread.Sleep(2000);
Dispatcher.BeginInvoke(new Action(() =>
{
listview1.ItemsSource = new List<string> { "NEWDATA" };
}));
}
}不能从后台线程设置UI控件的属性。
https://stackoverflow.com/questions/50442099
复制相似问题