我使用两个不同的app客户端来提取数据以显示在我的应用程序的主页上。我想在用户到达主页之前将这段代码移动到app.xaml.cs下载数据。我不知道如何在主页上为我的列表设置条目源。到目前为止我的情况是这样的。
Application_Launching中的代码
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>谢谢你的帮助。
更新
请参阅上面更新的代码和下面的ViewModel
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));
}
}我已经在主页后面的代码中设置了数据文本。这是我第一次使用ViewModel,所以我不太确定我应该在这里放什么。该应用程序运行时没有任何问题,但没有显示任何数据。
发布于 2012-04-26 17:44:36
查看默认的"Windows数据库应用程序“Windows项目。这个项目有一个它在应用程序中创建的ViewModel,这个ViewModel由MainPage使用。然后,MainPage使用绑定来获取它需要的数据。您可以从应用程序中设置ViewModel中的数据
ViewModel.Genres = genresData.results;那么你的xaml看起来就像
<ListBox ItemsSource="{Binding Genres}">
...
</ListBox>为了在设置类型时更新UI,ViewModel中的属性必须触发PropertyChanged事件。
private IEnumerable<Genre> _genres; // backing field
public IEnumerable<Genre> Genres
{
get { return _genres; }
set
{
_genres = value;
OnPropertyChanged("Genres");
}
}发布部分也是一样的。
发布于 2012-04-26 16:52:20
可以向App类添加一个属性,并将其设置为保存已下载和反序列化的数据。
您所要做的就是使用此属性加载页面的数据文本。
编辑
覆盖App类的OnStartup并从App.xaml中删除StartURI:
base.OnStartUp(e);Window1 w=新Window1();w.DataContext = ViewModel;this.MainWindow = w;w.Show();
https://stackoverflow.com/questions/10337825
复制相似问题