我在Visual Studio中使用基于模板的GroupedItemsPage。提供了SampleDataSource,因此我将其用作示例并创建了自己的数据源。但是,我想将项目添加到网格视图中,这些项目是异步下载的。问题是,一旦我得到结果并处理它们并将它们添加到数据源,屏幕就不会更新以显示新的网格页面。
这是我在GroupedItemsPage类上的LoadState
方法:
protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
// TODO: Create an appropriate data model for your problem domain to replace the sample data
var h = DataModel.MainPageDataSource.GetSingleton().GetGridGroups("AllGroups");
this.DefaultViewModel["Groups"] = h;
}
这是我的数据源类:
class MainPageDataSource : FacepunchWin8.Common.BindableBase
{
public static MainPageDataSource _singleton = new MainPageDataSource();
public static MainPageDataSource GetSingleton() { return _singleton; }
private static Uri _baseUri = new Uri("ms-appx:///");
private ObservableCollection<MainPageGrid> _gridGroups = new ObservableCollection<MainPageGrid>();
void IndexParserComplete(HTMLParser p)
{
HTMLParserIndex parser = p as HTMLParserIndex;
foreach (ForumSection f in parser.GetForumSections())
{
MainPageGrid forumGrid = new MainPageGrid(f.Title(), f.Title());
_gridGroups.Add(forumGrid);
}
}
private void ItemsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
}
public MainPageDataSource()
{
HTMLParserIndex parser = new HTMLParserIndex();
parser.SetComplateDelegate(IndexParserComplete);
Scraper.GetSingleton().RequestForumIndex(parser);
MainPageGrid Grid1 = new MainPageGrid("GRID1", "TestPage");
Grid1.Items.Add(new MainPageGridItem("Grid00", "GridOne", "Subtitle", "Assets/DarkGray.png"));
_gridGroups.Add(Grid1);
}
public ObservableCollection<MainPageGrid> GetGridGroups(string uniqueId)
{
if (!uniqueId.Equals("AllGroups")) throw new ArgumentException("Only 'AllGroups' is supported as a collection of groups");
return _gridGroups;
}
}
构造函数创建一些类似SampleDataSource
的项目,它们在屏幕上正确显示。但是,从Internet下载数据后,将调用IndexParserComplete
,这会向_gridGroups添加一些新项目。如何通知GroupedItemsPage刷新屏幕并重新读取数据源中的数据?
答案 0 :(得分:0)
我终于找到了答案。结果是从另一个线程修改ObservableCollection /设置不支持来自另一个线程的数据源。由于我是从异步操作添加数据,因此我需要使用Dispatcher来使用主UI线程添加数据。
_gridGroups.Add(forumGrid);
中的{p> IndexParserComplete(HTMLParser p)
我替换为:
this._uiDispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
DataModel.MainPageDataSource.GetSingleton().AddPageGrid(forumGrid);
})
其中_uiDispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher
;