异步方法绑定的数据不是在firstload上,而是绑定在UWP中的第二个负载上

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)

Rom*_*asz 5

你做错了几件事:

  • 如果不是真的需要(例如事件),不要使async void,
  • 你正在运行你LoadData()的构造函数,因为它忘记了,它没有等待(它在构造函数中也是不可能的),代码更进一步,你将listview的itemssource设置为Namedays.您没有对ItemsSource使用绑定,因此当您在加载的方法中更改Namedays时,它不会被listview反映出来.
  • 除此之外,还asigning新的价值NamedaysLoadData(),你不改变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.