2014-11-04 158 views
0

我试图通过在私有异步无效和声明集合中声明Posts类的新实例来将一些示例数据添加到可观察集合中。当应用程序加载时,它不显示内容。代码编译没有错误/警告。添加数据到ObservableCollection时遇到问题

如果我要在Posts()方法中添加样本数据,那么它将按预期显示。

如何从我的私人异步无效填充可观察集合,并在应用程序启动时显示内容?

XAML:

<ListView ItemsSource="{StaticResource Posts}" 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding Title}/> 
       <TextBlock Text="{Binding Author}/> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

C#

public class Data2 { 
    public string Title { get; set; } 
    public string Author { get; set; } 

    public Data2(string title, string author) { 
     this.Title = title; 
     this.Author = author; 
    } 
} 

public class Posts : ObservableCollection<Data2> { 
    public Posts() { 
    } 
} 

public sealed partial class MainPage : Page { 
    public MainPage() { 
     this.InitializeComponent(); 

     this.NavigationCacheMode = NavigationCacheMode.Required; 

     GetPosts(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) { 
    } 

    private async void GetPosts() { 
     try { 
      var client = new HttpClient(); 
      var response = await client.GetAsync(new Uri("http://mywebsite.com/posts.json")); 
      var result = await response.Content.ReadAsStringAsync(); 
      var json = ParseData(result); 

      Posts posts = new Posts(); 
      posts.Add(new Data2("Sample Title 1", "Sample Author 1")); 
      posts.Add(new Data2("Sample Title 2", "Sample Author 2")); 
     } 
     catch(HttpRequestException hre) { 
      System.Diagnostics.Debug.WriteLine(hre); 
     } 
     catch(Exception ex) { 
      System.Diagnostics.Debug.WriteLine(ex); 
     } 
    } 

    private static RootObject ParseData(string json) { 
     return JsonConvert.DeserializeObject<RootObject>(json); 
    } 
} 

回答

2

我建议创建的 “帖子” 属性视图模型:

public class PostsViewModel 
{ 
    public Posts PostData { get; private set; } 

    public PostsViewModel() 
    { 
     PostData = new Posts(); 
     GetPosts(); 
    } 

    private async void GetPosts() 
    { 
     // ... 
    } 
} 

现在设置页的的DataContext到的实例查看型号:

public sealed partial class MainPage : Page { 
    private readonly PostsViewModel _viewmodel; 

    public MainPage() { 
     this.InitializeComponent(); 

     this.NavigationCacheMode = NavigationCacheMode.Required; 

     _viewmodel = new PostsViewModel(); 
    } 
} 

,并绑定ListView的的ItemsSource在视图模型属性:

<ListView ItemsSource="{Binding Posts}" 

(当然,你可以,而不是仅仅把集合中的页面的代码隐藏,并设置DataContext=this,但它是一个很好的在总体思路来分隔视图模型逻辑)

0

线以上:

如果您之前已经声明了静态雷索
<ListView ItemsSource="{StaticResource Posts}"> 

应只工作uce,作为休耕地:

myWindow.Resources.Add("Posts", Posts); 

尽管使用动态会更好。 您可以将您的Window数据上下文设置为Posts类,并进行异步调用以填充Posts构造函数中的数据。然后使用:

<ListView ItemsSource="{Binding Posts}"> 

您应该一收到响应就会看到数据。

相关问题