2012-04-26 73 views
2

我使用兩個不同的Web客戶端來下拉數據以顯示在我的應用程序的主頁面中。我想將這些代碼移動到app.xaml.cs中,以在用戶進入主頁面之前下載數據。我不確定如何在主頁面上爲我的列表框設置itemssource。這是迄今爲止我所擁有的。內Application_LaunchingApplication_Launch中的WP7 webclient

 private void Application_Launching(object sender, LaunchingEventArgs e) 
    { 
     // WebClient jsonGenres 
     WebClient jsonGenres = new WebClient(); 
     Uri apiGenres = new Uri("http://api.beatport.com/catalog/3/genres"); 
     jsonGenres.DownloadStringCompleted += newDownloadStringCompletedEventHandler (jsonGenres_GetDataCompleted); 
     jsonGenres.DownloadStringAsync(apiGenres); 

     // WebClient jsonHome 
     WebClient jsonHome = new WebClient(); 
     Uri apiHome = new Uri ("http://api.beatport.com/catalog/3/beatport/home"); 
     jsonHome.DownloadStringCompleted += newDownloadStringCompletedEventHandler (jsonHome_GetDataCompleted); 
     jsonHome.DownloadStringAsync(apiHome); 

    } 

    // Deserialize genres data 
    public void jsonGenres_GetDataCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     GenresHome genresData = JsonConvert.DeserializeObject<GenresHome>(e.Result); 

     ViewModel.Genres = genresData.results; 
     //this.listGenres.ItemsSource = genresData.results; 
    } 

    // Deserialize home page data 
    public void jsonHome_GetDataCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     ReleasesHome homeData = JsonConvert.DeserializeObject<ReleasesHome>(e.Result); 

     const int limit = 6; 
     ViewModel.Releases = homeData.results.featuredReleases.Take(limit); 
     //this.listRelease.ItemsSource = homeData.results.featuredReleases.Take(limit); 
    } 

代碼和我的主網頁XAML代碼。

   <ListBox x:Name="listRelease" ItemsSource="{Binding ReleasesHome}" Grid.Row="0" ScrollViewer.VerticalScrollBarVisibility="Disabled" > 
        <ListBox.ItemsPanel> 
         <ItemsPanelTemplate> 
          <toolkit:WrapPanel Orientation="Horizontal" /> 
         </ItemsPanelTemplate> 
        </ListBox.ItemsPanel> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Vertical"> 
           <toolkit:HubTile Source="{Binding images.large.url}" MouseLeftButtonUp="releaseSelectedHandler" Margin="10" IsFrozen="True" /> 
           <TextBlock Text="{Binding name}" Width="173" /> 
           <ListBox ItemsSource="{Binding artists}" Height="28" ScrollViewer.VerticalScrollBarVisibility="Disabled" > 
            <ListBox.ItemTemplate> 
             <DataTemplate> 
              <TextBlock Text="{Binding name}" Margin="10,0,0,0" Width="173" Style="{StaticResource PhoneTextSubtleStyle}" /> 
             </DataTemplate> 
            </ListBox.ItemTemplate> 
           </ListBox> 
          </StackPanel> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 
      </Grid> 
     </controls:PanoramaItem> 

    <!--Panorama item four-->   
    <controls:PanoramaItem x:Name="genres" Header="genres"> 
    <!--Single line list--> 
      <Grid> 
       <ListBox x:Name="listGenres" ItemsSource="{Binding GenresHome}"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Vertical"> 
           <TextBlock x:Name="genresTxtBlock" Text="{Binding name}" MouseLeftButtonUp="genreSelectedHandler" Margin="10,5,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}" />          
          </StackPanel> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox>  
      </Grid>   
    </controls:PanoramaItem> 

感謝您的幫助。

UPDATE

見上面更新的代碼和下面

public class MainViewModel : INotifyPropertyChanged 
{ 
    public MainViewModel() 
    { 

    } 

    private IEnumerable<ResultGenreHome> _genres; // backing field 
    public IEnumerable<ResultGenreHome> GenresHome 
    { 
     get { return _genres; } 
     set 
     { 
      _genres = value; 
      OnPropertyChanged("GenresHome"); 
     } 
    } 

    private IEnumerable<FeaturedReleasesHome> _releases; // backing field 
    public IEnumerable<FeaturedReleasesHome> ReleasesHome 
    { 
     get { return _releases; } 
     set 
     { 
      _releases = value; 
      OnPropertyChanged("ReleasesHome"); 
     } 
    } 

    private void OnPropertyChanged(string p) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool IsDataLoaded 
    { 
     get; 
     private set; 
    } 

    public void LoadData() 
    { 
     this.IsDataLoaded = true; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (null != handler) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

我的主頁設置的datacontext在後面的代碼我的視圖模型。這是我第一次使用ViewModel,所以我不確定我應該放在這裏。該應用程序運行沒有任何問題,但沒有數據顯示。

回答

0

看看默認的「Windows Phone Databound應用程序」Windows Phone項目。這個項目有一個在App中創建的ViewModel,這個ViewModel被MainPage使用。 MainPage然後使用Binding來獲取它需要的數據。您可以通過執行

ViewModel.Genres = genresData.results; 

設置視圖模型從App數據然後你的XAML會是什麼樣子

<ListBox ItemsSource="{Binding Genres}"> 
    ... 
</ListBox> 

爲了當您設置的流派要更新的用戶界面,你的財產ViewModel必須觸發PropertyChanged事件

private IEnumerable<Genre> _genres; // backing field 
public IEnumerable<Genre> Genres 
{ 
    get { return _genres; } 
    set 
    { 
     _genres = value; 
     OnPropertyChanged("Genres"); 
    } 
} 

發佈部分也是如此。

+0

請看我的更新,我已經嘗試過。我從來沒有使用視圖模型,所以我不知道它應該如何設置。 – nos9 2012-04-26 18:56:47

+0

您必須觸發PropertyChanged事件。看到我更新的帖子。如果您是MVVM的新手,請做一些調查。這裏是一個很好的小文章開始 http://www.windowsphonegeek.com/articles/Windows-Phone-Mango-Getting-Started-with-MVVM-in-10-Minutes – 2012-04-26 19:24:38

+0

我明白你在說什麼,但是這段代碼給了我很多錯誤,包括「_genres是一個字段,但是像一個類型一樣使用」。我會閱讀MVVM,看看我能不能找出一些東西。 – nos9 2012-04-26 20:16:14

0

您可以將一個屬性添加到App類並將其設置爲保存下載和反序列化的數據。

您只需要使用此屬性加載頁面的datacontext。

EDIT

在此改變App類的OnStartup並從App.xaml中取出StartURI:

base.OnStartUp(E); Window1 w = new Window1(); w.DataContext = ViewModel; this.MainWindow = w; w.Show();

+0

感謝您的回答。你能否提供一個如何完成的例子。仍然是初學者程序員。 – nos9 2012-04-26 17:01:33

+0

據我可以看到,所有缺少的是將窗口的DataContext設置爲App.ViewModel。找到您打開窗口/視圖的位置,並將其DataContext分配給App.ViewModel。如果找不到它,則應刪除App.xaml中的StartupURI並覆蓋App類的OnStartup方法。看到我的答案在這裏:http://stackoverflow.com/questions/6306549/override-onstartup-in-wpf – 2012-04-26 19:12:54