one*_*end 0 c# xaml async-await uwp
我有一个异步方法.我试图从web上的json文件绑定listview.我正在开发通用Windows平台应用程序.我第二次打开页面时正在加载列表视图.但是当然我希望在第一次加载时加载列表视图.什么可能导致问题呢?谢谢.这是我的XAML的代码隐藏.
public MyPage()
{
this.InitializeComponent();
Namedays = new List<NamedayModel>();
LoadData();
listview1.ItemsSource = Namedays;
}
public async void LoadData()
{
Namedays = await GetAllNamedaysAsync();
}
private static List<NamedayModel> allNamedaysCache;
public static async Task<List<NamedayModel>> GetAllNamedaysAsync()
{
if (allNamedaysCache != null)
return allNamedaysCache;
var client = new HttpClient();
var stream = await client.GetStreamAsync("http://www.example.com/myfile.json");
var serializer = new DataContractJsonSerializer(typeof(List<NamedayModel>));
allNamedaysCache = (List<NamedayModel>)serializer.ReadObject(stream);
return allNamedaysCache;
}
Run Code Online (Sandbox Code Playgroud)
你做错了几件事:
LoadData()的构造函数,因为它忘记了,它没有等待(它在构造函数中也是不可能的),代码更进一步,你将listview的itemssource设置为Namedays.您没有对ItemsSource使用绑定,因此当您在加载的方法中更改Namedays时,它不会被listview反映出来.LoadData(),你不改变ListView的的ItemsSource的价值-它仍然指向旧的集合.在这种情况下,如果您使用了ItemsSource的绑定,定义属性并在例如Loaded事件中异步加载数据,则会更好.示例代码,XAML:
<ListView ItemsSource="{Binding Namedays}"/>
Run Code Online (Sandbox Code Playgroud)
而背后的代码:
public sealed partial class MainPage : Page, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
private List<NamedayModel> namedays = new List<NamedayModel>();
public List<NamedayModel> Namedays { get { return namedays; } set { namedays = value; RaiseProperty(nameof(Namedays)); } }
public MainPage()
{
this.InitializeComponent();
this.DataContext = this;
this.Loaded += MainPage_Loaded;
}
private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
Namedays = await GetAllNamedaysAsync();
}
public static async Task<List<NamedayModel>> GetAllNamedaysAsync()
{
if (allNamedaysCache != null)
return allNamedaysCache;
var client = new HttpClient();
var stream = await client.GetStreamAsync("http://www.tyosoft.com/namedays_hu.json");
var serializer = new DataContractJsonSerializer(typeof(List<NamedayModel>));
allNamedaysCache = (List<NamedayModel>)serializer.ReadObject(stream);
return allNamedaysCache;
}
}
Run Code Online (Sandbox Code Playgroud)
作为旁注 - 如果要在不重新分配的情况下修改它,您也可以考虑使用ObservableCollection而不是List.
| 归档时间: |
|
| 查看次数: |
1617 次 |
| 最近记录: |