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

この投稿の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 に答える