Silverlight& MVVM:从VM中的Web服务加载数据

时间:2011-03-29 03:19:10

标签: silverlight mvvm

我正在尝试设置viewModel(VM)以包含处理从Web服务获取数据的逻辑,然后将数据加载到模型中,然后通过ViewModel将其公开给View。 / p>

视图模型

public StudentViewModel : INotifyPropertyChanged
{
    private List<Student> _students;
    public List<Student> Student
    {
        get{.....}
        set{.....}
    }

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

查看

将数据上下文设置为上面定义的viewModel

<UserControl DataContext=..... />

问题

因为我从ViewModel的ctor调用Web服务,我认为VisualStudio的设计师正在投入合适。 现在,我可以从视图的PageLoad方法调用我的VM上的Load方法,但我想知道是否有更好的方法来处理这个问题?

原因

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

3 个答案:

答案 0 :(得分:2)

您应该在构造函数中为DesignerProperties类的属性IsInDesignMode添加一个检查。

如果IsInDesignMode返回false,您应该从Web服务加载学生。如果您在DesignMode中,则可以构造虚拟对象以使用DesignTime数据初始化viewmodel。

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 :(得分:1)

您是否使用ServiceLocator创建ViewModels?

我认为您可以使用ServiceLocator解决您的问题。 Locator可以创建新的ViewModel对象,调用(在异步模式下)Web服务并返回VM。然后在VM中,您可以拥有将处理Web服务调用的完整事件的代码。

为了与设计人员合作,您可以在ServiceLocator中获得一个代码,该代码仅在应用程序处于运行时而不是Visual Studio设计器中时调用服务。

当然我不确定这是否适合您的程序架构,但它可以工作。

答案 2 :(得分:1)

您可以添加测试,以便不调用服务when in design mode