Silverlight和MVVM:在VM中从Web服务加载数据

3
我将尝试设置viewModel(VM)来包含处理从Web服务获取数据的逻辑,然后将数据加载到模型中,然后通过ViewModel向View公开模型。 ViewModel
public StudentViewModel : INotifyPropertyChanged
{
    private List<Student> _students;
    public List<Student> Student
    {
        get{.....}
        set{.....}
    }

    public StudentViewModel()
    {
        //call webservice and load the data into Students
    }    
}

视图

将 data-context 设置为上面定义的 viewModel

<UserControl DataContext=..... />

问题

由于我在ViewModel的构造函数中调用了Web服务,我认为VisualStudio的设计器会出现问题。 现在,我可以从视图的PageLoad方法中调用VM上的Load方法,但我想知道是否有更好的方法来处理这个问题?

原因

我在CTOR中加载学生的原因是我想在视图首次加载时显示学生列表。

3个回答

2
你应该在构造函数中添加对DesignerProperties类的属性IsInDesignMode进行检查。
如果IsInDesignMode返回false,则应从webservice中加载你的学生数据。如果你处于DesignMode模式下,可以构造虚拟对象来初始化你的视图模型以使用DesignTime数据。
public class StudentViewModel : INotifyPropertyChanged{

    public StudentViewModel() {
       if (DesignerProperties.IsInDesignMode) {
         // constructor dummy objects or initialize your viewmodel with DesignTime values
       }
       else {
         // initialize viewmodel with data from webservice
       }


    }

    // rest of the class
  }

1
你是否使用ServiceLocator来创建ViewModels?
我认为你可以通过使用ServiceLocator来解决你的问题。定位器可以创建新的ViewModel对象,调用(异步模式)Web服务并返回VM。然后在VM中,您可以编写代码来处理Web服务调用的完成事件。
为了与设计师合作,您可以在ServiceLocator中添加一个代码,仅当应用程序处于运行时而不是Visual Studio设计器中时才调用服务。
当然,我不确定这是否适用于您的程序架构,但它可能有效。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接