数据应该在哪里加载到 ViewModel
Posted
技术标签:
【中文标题】数据应该在哪里加载到 ViewModel【英文标题】:Where should data be loaded into the ViewModel 【发布时间】:2017-08-04 18:12:44 【问题描述】:我正在使用 Xamarin.Forms 并希望调用异步方法将数据加载到视图模型中。
我应该如何将数据(异步)加载到视图模型中?
我尝试在构造函数中这样做,但我无法在构造函数中调用异步方法。
这是我的代码:
public List<IdeaResource> IdeasList;
public IdeasViewModel()
HypermediaClient client = new HypermediaClient();
IdeasList = await client.GetIdeasAsync();
【问题讨论】:
请更具体。您可以通过等待 Task虽然绝对不是最佳做法,但有一种变通方法。创建一个事件并从构造函数中调用该事件。
解决方法是事件处理程序可以是异步的,并且调用事件不会阻塞 UI 线程。
public class IdeasViewModel : ViewModelBase
public List<IdeaResource> IdeasList;
public IdeasViewModel()
Initialized += OnInitialized;
Initialized(this, EventArgs.Empty);
private event EventHandler Initialized = delegate ;
private async void OnInitialized(object sender, EventArgs e)
//unsubscribing from the event
Initialized += OnInitialized;
//call async
var client = new HypermediaClient();
IdeasList = await client.GetIdeasAsync();
理想情况下,数据加载功能应该采用公开可用的方法
public async Task LoadDataAsync()
var client = new HypermediaClient();
IdeasList = await client.GetIdeasAsync();
并在视图中调用事件处理程序。
public class IdeasPage : ContentPage
private IdeasViewModel viewModel;
public IdeasPage()
//...assign variables
protected override void OnAppearing()
this.Appearing += Page_Appearing;
private async void Page_Appearing(object sender, EventArgs e)
//...call async code here
await viewModel.LoadDataAsync();
//unsubscribing from the event
this.Appearing -= Page_Appearing;
【讨论】:
以上是关于数据应该在哪里加载到 ViewModel的主要内容,如果未能解决你的问题,请参考以下文章
我应该在我的 Emacs Lisp 包中的哪里添加自动加载 cookie?有明确的指南吗?