2014-11-04 154 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}"> 

您應該一收到響應就會看到數據。

相關問題