0

私のアプリの基本的なナビゲーション機能は、リストボックスからアイテムを選択し、選択されたアイテムを判断してそのid値を取得することで構成されています。値を次のページに渡しid、Web クライアントで使用して新しいデータを取得するための API URL に追加します。これが私が今持っているものです。

選択したアイテムを決定し、2 番目のページに移動します。

    public void genreSelectedHandler(object sender, RoutedEventArgs e)
    {
        ResultGenre data = (sender as TextBlock).DataContext as ResultGenre;
        ListBoxItem pressedItem = this.listGenres.ItemContainerGenerator.ContainerFromItem(data) as ListBoxItem;
        if (pressedItem != null)
        {
            string genreID = "http://api.beatport.com/catalog/3/beatport/genre?id=" + data.id;

            this.NavigationService.Navigate(new Uri("/Pages/GenrePage.xaml?genreID=" + genreID, UriKind.Relative));
        }
    }

セカンダリ ページでは、OnNavigatedTo を使用して前のページから URL を取得できますが、行き詰まっている部分はその URL を Web クライアントにプラグインすることです。

    public GenrePage()
    {
        InitializeComponent();

        // WebClient jsonRelease
        WebClient jsonGenres = new WebClient();
        Uri apiGenre = new Uri("URL from previous page goes here");
        jsonGenres.DownloadStringCompleted += new DownloadStringCompletedEventHandler(jsonGenres_GetDataCompleted);
        jsonGenres.DownloadStringAsync(apiGenre);

    }

    // Textblock data from main page
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        string genreID = "";
        if (NavigationContext.QueryString.TryGetValue("genreID", out genreID))

        base.OnNavigatedTo(e);
    }

私ができる唯一のことは、セカンダリ ページの既存のコントロールに URL を追加することです。私がやろうとしていることを達成するためのより良い方法はありますか? MVVM フレームワークについて少し読みました。これを処理するより良い方法でしょうか?もしそうなら、それはどのように機能しますか?助けてくれてありがとう。

4

1 に答える 1

0

Uri のこの部分は"http://api.beatport.com/catalog/3/beatport/genre?id="変更されますか? そうでない場合は、すべてを渡す代わりに、クエリ文字列GenrePageのみを渡すことを検討してください。data.id次に、宛先ページで Uri を作成します。

スニペットで示した方法で行う必要がある場合は、次の手順を実行します。

string genreID = @"http://api.beatport.com/catalog/3/beatport/genre?id=" + data.id;
this.NavigationService.Navigate( new Uri( "/Pages/GenrePage.xaml?genreID=" + 
  Uri.EscapeDataString( genreID ), UriKind.Relative ) );

GenrePage.xaml.cs 内

public partial class GenrePage : PhoneApplicationPage
{
  public GenrePage()
  {
    InitializeComponent();
  }

  protected override void OnNavigatedTo( NavigationEventArgs e )
  {
    base.OnNavigatedTo( e );

    string genreID = String.Empty;
    if( NavigationContext.QueryString.TryGetValue( "genreID", out genreID ) ) {
      LaunchWebClient( genreID );
    }
  }

  private void LaunchWebClient( string genreID )
  {
    WebClient jsonGenres = new WebClient();
    Uri apiGenre = new Uri( genreID );

    jsonGenres.DownloadStringCompleted += new 
      DownloadStringCompletedEventHandler( jsonGenres_GetDataCompleted );
    jsonGenres.DownloadStringAsync( apiGenre );
  }
}

Uri.EscapeDataStringは、適切なエスケープ文字をクエリ文字列に挿入します。クエリ文字列は宛先ページで自動的にエスケープ解除されるため、そこで特別なことをする必要はありません。

于 2012-04-23T01:28:10.050 に答える