异步方法后初始化xamarin视图

时间:2019-01-17 19:15:37

标签: xamarin asynchronous mvvm viewmodel

大家晚上好。

一段时间以来,我去过Xamarin。我的第一个测试是结论性的。我决定尝试制作一个小型应用程序,该应用程序通过API检索数据库中的信息,然后通过ListView更新此数据。 当我在模拟器上启动该应用程序时,一切正常,但是一旦在手机上安装该应用程序,它就会崩溃。我以为这是因为有API,但我有一个API可用来检查登录/密码是否正常。 返回数据的API在3500/4000左右有很多行,这可能是原因吗?

因此,我通过异步方法在viewModel中传递了数据加载,但是现在的问题是,在正确加载数据之前先加载视图。加载数据后,是否有一种方法可以初始化视图?

在我的代码下面。

初始化我的viewModel

class ManageInventViewModel
{
    public ObservableCollection<InventViewModel> InventProduct { get; set; }

    public Command<InventViewModel> UpdateCommand
    {
        get
        {
            return new Command<InventViewModel>(invent =>
            {
                var index = invent.IndexLigneInventaire;
                InventProduct.Remove(invent);
                InventProduct.Insert(index, invent);
            });
        }
    }

    public Command<InventViewModel> ResetStock
    {
        get
        {
            return new Command<InventViewModel>(invent =>
            {
                var index = InventProduct.IndexOf(invent);
                InventProduct.Remove(invent);
                invent.RealStockProduct = 0;
                InventProduct.Insert(index, invent);
            });
        }
    }

    public ManageInventViewModel()
    {
        LoadInventaire();
    }

    private async void LoadInventaire()
    {
        var listMvt = await Utils.Utils.GetListMouvementUntilDate();
        var listStock = Utils.Utils.GetStockByProduct(listMvt).Take(20);

        InventProduct = new ObservableCollection<InventViewModel>();

        var indexLine = 0;
        foreach (var stock in listStock)
        {
            var inventViewModel = new InventViewModel
            {
                LibelleProduit = stock.LibelleProduit,
                PrCodeProduit = stock.PrCodeProduit,
                UpCodeProduit = stock.UpCodeProduit,
                RealStockProduct = stock.StockTheoProdct,
                StockTheoProdct = stock.StockTheoProdct,
                IndexLigneInventaire = indexLine
            };
            ++indexLine;
            InventProduct.Add(inventViewModel);
        }
    }
}

初始化我的观点

public partial class InventPage : ContentPage
{
    public InventPage()
    {
        InitializeComponent();

        TableInvent.ItemSelected += (sender, e) =>
        {
            if (TableInvent.SelectedItem != null)
            {
                if (TableInvent.SelectedItem is InventViewModel item)
                {
                    PopupNavigation.Instance.PushAsync(new ChangeStockModal(item, this));
                }

                TableInvent.SelectedItem = null;
            }
        };
    }

    private void Reset_Stock(object sender, EventArgs e)
    {
        var input = sender as Button;
        var inventViewModel = input?.BindingContext as InventViewModel;
        var listViewModel = BindingContext as ManageInventViewModel;
        listViewModel?.ResetStock.Execute(inventViewModel);
    }

    public void Update_Stock_List(InventViewModel dataStockUpdate)
    {
        var listViewModel = BindingContext as ManageInventViewModel;
        listViewModel?.UpdateCommand.Execute(dataStockUpdate);
        PopupNavigation.Instance.PopAsync();
    }
}

谢谢

1 个答案:

答案 0 :(得分:1)

  
    

我设法创建了ActivityIndi​​cator,但是在显示等待屏幕时却无法加载数据。

  

关于此问题,我看不到代码中的useActivityIndi​​cator,也许您没有更新代码,我想如果您使用useActivityIndi​​cator,您可以将一个属性绑定到ActivityIndi​​cator IsRunning和IsVisible,那么您可以解决您的问题问题。 相关使用ActivityIndi​​cator步骤,您可以看一下:

ActivityIndicator