我尝试通过在私有异步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);
}
}
答案 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}">
您应该在收到回复后立即看到数据。