【发布时间】: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 延迟到数据加载后只会让用户认为应用程序什么都不做并且已损坏
-
为什么在加载数据时不使用 ActivityIndicator?之后,只需正确显示视图。您不能暂停视图加载
-
感谢您的回答,我将尝试设置 ActivityIndicator 并查看它是否有效。我会回来询问它是否无法正常工作。
-
我遇到了问题。我设法创建了 ActivityIndicator,但在显示等待屏幕时无法加载数据。一旦数据加载如何将它们发送到我的 ListView 的初始化页面?
标签: xamarin asynchronous mvvm viewmodel