我有一个使用 MVVM 模式的 windows phone (wp8) 应用程序,它包含一个带有枢轴控件的 View 并绑定(bind)到一个 ViewModel (PivotMainViewModel)。
每个数据透视项目包含不同的 View (数据模板)并绑定(bind)到自己的 View 模型(PivotItemViewModel1、PivotItemViewModel1 等),所有这些都运行良好。
我的 PivotMainViewModel 是通过 xaml 绑定(bind)初始化的,但由于它需要一个参数,因此它也通过 View 的 OnNavigatedTo 事件“初始化”。
PivotItemViewModel4 pivotItemViewModel4 = Resources["PivotItemViewModel4"] as PivotItemViewModel4;
if (selectedRow.Id > 0)
{
pivotItemViewModel4.InitializeDocumentDetails(selectedRow);
}
但我不确定如何处理我想要异步发出的 Web 服务请求。我需要为每个单独的数据透视项“ View ”发出 Web 服务请求,并在数据返回的那一刻加载数据,但我需要在数据透视初始化后立即执行此操作,但我不确定以下内容:
我应该从构造函数中调用它吗:
public PivotItemViewModel1
{
this.Document = GetDocument();
}
或者当其内部变量为空时,我的属性(property)的获取部分? IE。
public Document Document
{
get { return this._document ?? GetDocument(); }
}
或其他?
如果我应该从单个 View 模型的构造函数中调用它,我该怎么做?我不能在构造函数上使用异步,也不能在属性上设置异步。
在处理 MVVM 时,对 Web 服务进行异步调用的最佳方法是什么。
最佳答案
有不同的问题需要牢记:
所以,问题是:
提出了#2 和#3 之间的权衡。这真的是一个判断电话,取决于您希望应用程序具有什么样的感觉。
I'm not sure whether I should make all the asynchronous call from PivotMainViewModel or from each individual viewmodel defined for each of the pivot item
我确实认为上面的#1 暗示了后者——为了封装,如果可能,每个 View 模型都应该拥有自己的数据。
编辑 要在属性上使用异步,您必须使用 setter,而不是 getter。 Hook 到 View 模型的“初始化”事件(或类似事件):
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();
}
关于c# - 何时以及如何在 Windows Phone wp8 中的 ViewModel 中调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22129698/