我正在尝试设置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中加载学生的原因是我想在首次加载视频时显示学生列表。
答案 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: