无法将数据添加到ObservableCollection

时间:2014-11-04 00:52:22

标签: c# windows-phone-8

我尝试通过在私有异步void中声明Posts类的新实例并填充集合来尝试将一些示例数据添加到可观察集合中。当应用加载时,它不会显示内容。代码编译时没有错误/警告。

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

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

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 个答案:

答案 0 :(得分: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,但通常将视图模型逻辑分开是一个好主意。)

答案 1 :(得分:0)

以上一行:

<ListView ItemsSource="{StaticResource Posts}"> 

只有在您之前已宣布使用静态资源时才应起作用:

myWindow.Resources.Add("Posts", Posts);
但是,最好使用动态。 您可以将Window数据上下文设置为Posts类,并执行异步调用以填充Posts构造函数中的数据。然后使用:

<ListView ItemsSource="{Binding Posts}">

您应该在收到回复后立即看到数据。