繁体   English   中英

何时以及如何在Windows Phone wp8中的ViewModel中调用异步方法

[英]When and how to call asynch method in ViewModel in windows phone wp8

我有一个使用MVVM模式的Windows Phone(wp8)应用程序,其中包含带有枢轴控件的视图,并绑定到ViewModel(PivotMainViewModel)。

每个数据透视表项都包含一个不同的视图(数据模板),并绑定到其自己的视图模型(PivotItemViewModel1,PivotItemViewModel1等),并且所有这些都运行良好。

我的PivotMainViewModel是通过xaml绑定初始化的,但是由于它需要一个参数,因此还可以通过视图的OnNavigatedTo事件对其进行“初始化”。

PivotItemViewModel4 pivotItemViewModel4 = Resources["PivotItemViewModel4"] as PivotItemViewModel4;
if (selectedRow.Id > 0)
{
    pivotItemViewModel4.InitializeDocumentDetails(selectedRow);

}

但是我不确定如何处理要异步发出的Web服务请求。 我需要为每个单独的枢轴项目“视图”提出一个Web服务请求,并在返回数据的那一刻加载数据,但是一旦枢轴被初始化,我就需要这样做,但是我不确定以下内容:

  1. 我需要在每个数据透视表项“视图”中填充数据,并在其相关的视图模型中填充数据,但是我不确定是否应该从PivotMainViewModel或为每个数据透视表项定义的每个单独的视图模型进行所有异步调用。

  2. 我是从PivotMainViewModel调用此函数,还是从每个枢轴项目viewmodel调用此函数,何时应调用此函数?

我应该从构造函数中调用它吗:

public PivotItemViewModel1
{
  this.Document = GetDocument();
}

还是例如当其内部变量为null时获取属性的一部分?

public Document Document
{
    get { return this._document ?? GetDocument(); }
}

或其他?

如果应该从单个viewmodel的构造函数中调用此方法,该怎么做? 我不能在构造函数上使用异步,也不能在属性上设置异步。

处理MVVM时,对Web服务进行异步调用的最佳方法是什么。

  1. 同样,我不确定哪个最好:

    • 4.1显示某种进度条,请求所有4个请求,等待所有请求完成,然后隐藏进度条

    • 4.2在每个单独的视图中显示某种进度条,并在每个请求完成后相应地隐藏它们

  2. 最后一个问题...挂。 我已经准备了许多关于异步和挂起的文章,但是它们总是描述处理click事件时的问题,但是当您没有click事件但要调用时,我不明白该如何处理初始化视图模型时,将执行此操作。 如果您知道如何,请解释一下并提供一个简单的例子。

有不同的注意事项:

  1. 代码结构。 通常,对于模块化结构,您想限制视图和视图模型的范围。 (这也称为封装。)
  2. UX响应能力。 您不想让用户等待,如果他们必须等待,则向他们显示进度条/状态指示器。
  3. 数据使用。 用户可能正在建立数据连接,因此您希望对数据使用情况保持保守。

因此,问题如下:

  • 立即加载所有数据,或
  • 仅在用户滑动到给定视图时加载

在#2和#3之间进行权衡。 这实际上是一个判断电话,具体取决于您希望该应用程序具有什么样的感觉。

我不确定是否应该从PivotMainViewModel或从为每个数据透视表项定义的每个单独的ViewModel中进行所有异步调用

我确实认为上面的#1暗示了后者-为了封装起见,每个视图模型应尽可能拥有自己的数据。


编辑若要对属性使用异步,则必须使用setter而不是getter。 挂钩到视图模型的“初始化”事件(或类似事件):

public Document Document
{
    get { return this._document; }
    set
    {
        if (this._document == value)
            return;
        this._document = value;
        RaisePropertyChanged("Document");
    }
}

public async Task<Document> GetDocument
{
    // ...
}

private async Task LoadData()
{
    Document = GetDocument();
}

public void Initialize() 
{
    LoadData();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM