我正在尝试使用数据库中的数据加载我的列表视图。 数据将定期更新。
<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";
}
}
那么如何重新加载数据异步,我不想刷新页面。
我需要它在循环中以便我可以收听数据库,如果有新条目,它将更新列表
我知道数据致盲,但我很少有经验这样做,任何人都可以提供一个例子来指导我。
答案 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并使用按钮触发刷新功能