在导航到页面后异步加载项目到 ListView(Windows Phone 8.1)

3

我有一个Windows Phone 8.1 应用程序, 其中有一个按钮,可以导航到PageTwo.xaml。在PageTwo.xaml.cs中,在代码后台我有这样的内容:

string type = "";

protected override void OnNavigatedTo(NavigationEventArgs e) {
    type = e.Parameter.ToString();          
}

private void Page_Loaded(object sender, RoutedEventArgs e) {
    PageTwoListViewModel pageTwoListViewModel = ViewModelLocator.PageTwoListStatic;
    this.DataContext = pageTwoListViewModel;
}

我在Page_Loaded事件中设置DataContext的原因是因为该项目是一个ClassLibrary,并且我没有App.xaml文件,但这不应该影响与我的问题有关的任何内容。

然后在我的PageTwoViewModel中,我有以下内容:
public RelayCommand PageLoadedCommand { get; private set; }

public PageTwoListViewModel() {
    this.PageLoadedCommand = new RelayCommand(PageLoaded);
}

private void PageLoaded() {
    LoadList();
}

private async void LoadList() {
    ObservableCollection<MyListModel> _list = await DatabaseService.GetList();
    MyViewList = _list;
}

触发PageLoadedCommand的代码如下所示:
<Page (...)>
    <i:Interaction.Behaviors>
        <core:EventTriggerBehavior EventName="Loaded">
            <core:InvokeCommandAction Command="{Binding PageLoadedCommand}">
            </core:InvokeCommandAction>
        </core:EventTriggerBehavior>
    </i:Interaction.Behaviors>
</Page>

这里的问题在于OnNavigatedToPage_Loaded事件在页面可见之前就已经执行了,因此如果我有一个很长的列表需要填充,只有在所有事情都做完之后才会进入PageTwo.xaml,导致应用程序停止响应。
我想要做的是,在导航到PageTwo.xaml时,启动加载动画并异步填充我的ListView。怎么做呢?

你的PageLoadedCommand现在被触发了吗? - PolarBear
执行顺序为:OnNavigatedTo -> Page_Loaded -> PageLoadedCommand(PageLoaded) - Schrödinger's Box
我是指哪段代码会触发这个命令? - PolarBear
哦,好的,没明白。我会把它添加到主要问题中。 - Schrödinger's Box
1
我们在谈论多少个列表项?DatabaseService.GetList()的性质是什么?它真的是异步的吗?我在想,也许你的数据库服务以某种方式阻塞了UI线程。需要更多信息。 - Decade Moon
我使用的ORM在数据库调用方面并不完全是异步的,这实际上就是问题所在。 - Schrödinger's Box
1个回答

1
事实证明,我的问题来自一个非常愚蠢的事情。我的DatabaseService.GetList();并不完全是异步的,这就是导致问题的原因,所以只要保证数据库调用是异步的,上述实现就可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接