添加数据到ObservableCollection时遇到问题
问题描述:
我试图通过在私有异步无效和声明集合中声明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);
}
}
答
我建议创建的 “帖子” 属性视图模型:
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
,但它是一个很好的在总体思路来分隔视图模型逻辑)
答
线以上:
如果您之前已经声明了静态雷索<ListView ItemsSource="{StaticResource Posts}">
应只工作uce,作为休耕地:
myWindow.Resources.Add("Posts", Posts);
尽管使用动态会更好。 您可以将您的Window数据上下文设置为Posts
类,并进行异步调用以填充Posts
构造函数中的数据。然后使用:
<ListView ItemsSource="{Binding Posts}">
您应该一收到响应就会看到数据。