0

我有一个剧院列表,并从我的应用程序中创建了一个辅助磁贴以直接导航到特定剧院。我在查询字符串中传递了剧院的 ID:

我从文件“MainViewModel.cs”中的 WCF 服务加载剧院

在我的主页中,我有一个剧院列表,我可以导航到详细信息页面。

但是当我想从磁贴导航时,出现错误...

瓷砖:

ShellTile.Create(new Uri("/TheaterDetails.xaml?selectedItem=" + theater.idTheater, UriKind.Relative), tile, false);

我的剧院详情页面:

 public partial class TheaterDetails : PhoneApplicationPage
{

    theater theater = new theater();



    public TheaterDetails()
    {
        InitializeComponent();

    }


    protected override void OnNavigatedTo(NavigationEventArgs e)
    {

        if (!App.ViewModel.IsDataLoaded)
        {
            App.ViewModel.LoadData();

        }


        if (DataContext == null)
        {

            string selectedIndex = "";
            if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex))
            {
                int index = int.Parse(selectedIndex);

                    theater = (from t in App.ViewModel.Theaters
                               where t.idTheater == index
                               select t).SingleOrDefault();

                    DataContext = theater;

....
....
....

错误 :

https://dl.dropboxusercontent.com/u/9197067/error.png

就像没有加载数据一样......

你知道问题出在哪里吗?

解决方案可能很简单,但我是初学者......也许是因为我异步加载数据并且应用程序不会等到它完成......

谢谢

编辑 :

我的 LoadData() 方法:

 public void LoadData()
    {

        client.GetTheatersCompleted += new EventHandler<ServiceReference1.GetTheatersCompletedEventArgs>(client_GetTheatersCompleted);
        client.GetTheatersAsync();

 // Other get methods...

        this.IsDataLoaded = true;
        }


private void client_GetTheatersCompleted(object sender,       ServiceReference1.GetTheatersCompletedEventArgs e)
    {
        Theaters = e.Result;
    }
4

2 回答 2

0

您应该检查哪个变量实际上为空。在这种情况下,它看起来是Theaters(否则错误会更早抛出)。

由于Theaters是从网络调用中填充的,因此很可能是异步调用的,换句话说,当您从LoadData()数据返回时尚未出现(它仍在等待网络调用返回),并且正在等待网络服务返回它的价值观。

可能的解决方案:

  1. 使 LoadData() 成为一个async函数,然后使用await LoadData(). 这可能需要进行一些重写/重构以适应模式(此处async为一般介绍,async 此处为 Windows Phone 上的 Web 调用特定)
  2. 一种不涉及黑客攻击的巧妙方法(例如循环直到数据存在)是在实际填充数据时引发自定义事件,然后在该事件中进行 Tile 导航处理。这里有一个基本的例子。
于 2013-06-27T04:21:05.607 回答
0

所以我找到的解决方案,感谢这篇文章中的Servy:Using async/await with void method

我设法使用 async/await 来加载数据。

我将我的 LoadData() 方法替换为:

    public static Task<ObservableCollection<theater>> WhenGetTheaters(ServiceClient client)
    {
        var tcs = new TaskCompletionSource<ObservableCollection<theater>>();
        EventHandler<ServiceReference1.GetTheatersCompletedEventArgs> handler = null;
        handler = (obj, args) =>
        {
            tcs.SetResult(args.Result);
            client.GetTheatersCompleted -= handler;
        };
        client.GetTheatersCompleted += handler;
        client.GetTheatersAsync();
        return tcs.Task;
    }



    public async Task LoadData()
    {

        var theatersTask = WhenGetTheaters(client);
        Theaters = await theatersTask;


        IsDataLoaded = true;


    }

在我的页面中:

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        if (!App.ViewModel.IsDataLoaded)
        {
           await App.ViewModel.LoadData();
        }
于 2013-06-27T16:17:35.273 回答