【问题标题】:Windows Phone link from Tile error来自 Tile 错误的 Windows Phone 链接
【发布时间】:2013-06-28 00:17:35
【问题描述】:

我有一个剧院列表,并从我的应用程序中创建了一个辅助磁贴以直接导航到特定剧院。我在查询字符串中传递了剧院的 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;
    }

【问题讨论】:

    标签: windows-phone-8 tile argumentnullexception


    【解决方案1】:

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

    由于Theaters 是通过网络调用填充的,它很可能是异步调用的,换句话说,当您从LoadData() 返回时,数据还不存在(它仍在等待网络调用返回),并正在等待 Web 服务返回其值。

    可能的解决方案:

    1. 将 LoadData() 设为 async 函数,然后使用 await LoadData()。这可能需要进行一些重写/重构以适应async 模式(对asynchere 的一般介绍,以及特定于Windows Phone 上的网络调用here
    2. 一种不涉及 hack 的简洁方法(例如循环直到数据存在)是在实际填充数据时引发自定义事件,然后在该事件中进行 Tile 导航处理。有一个基本的例子here

    【讨论】:

    • 非常感谢您的回答,我编辑了我的问题,您能帮我使用 async/await 作为方法吗?我不知道该怎么做,因为它是一个 void 方法
    【解决方案2】:

    所以我找到了解决方案,感谢这篇文章中的 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();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      相关资源
      最近更新 更多