数据应该在哪里加载到 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... 来加载异步数据,就像其他任何时候异步获取函数的返回值一样 没有最佳实践,只有上下文中的良好实践。 【参考方案1】:

虽然绝对不是最佳做法,但有一种变通方法。创建一个事件并从构造函数中调用该事件。

解决方法是事件处理程序可以是异步的,并且调用事件不会阻塞 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?有明确的指南吗?

在哪里放置加载和保存功能

Rails - 将数据文件放在哪里?

我应该在哪里编写代码以便 Composer 可以自动加载我的 PHP 类?

我的 php.ini 是从哪里加载到 php Docker 容器中的?