【问题标题】:Initialize an xamarin view after an async method在异步方法之后初始化 xamarin 视图
【发布时间】:2019-01-17 19:15:37
【问题描述】:

大家晚上好。

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

所以我通过异步方法在我的 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();
    }
}

谢谢

【问题讨论】:

  • 一般来说,如果您需要异步加载数据,最好先使用微调器或对话框显示 UI,以指示正在发生的事情。将 UI 延迟到数据加载后只会让用户认为应用程序什么都不做并且已损坏
  • 为什么在加载数据时不使用 ActivityIndi​​cator?之后,只需正确显示视图。您不能暂停视图加载
  • 感谢您的回答,我将尝试设置 ActivityIndi​​cator 并查看它是否有效。我会回来询问它是否无法正常工作。
  • 我遇到了问题。我设法创建了 ActivityIndi​​cator,但在显示等待屏幕时无法加载数据。一旦数据加载如何将它们发送到我的 ListView 的初始化页面?

标签: xamarin asynchronous mvvm viewmodel


【解决方案1】:

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

关于这个问题,我没有从你的代码中看到你 useActivityIndi​​cator ,可能你没有更新你的代码,我想如果你使用 useActivityIndi​​cator ,你可以将一个属性绑定到 ActivityIndi​​cator IsRunning 和 IsVisible ,那么你可以解决你的问题问题。 相关使用ActivityIndi​​cator步骤,大家可以看看:

ActivityIndicator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多