日期:2014-05-18  浏览次数:20821 次

“MVVM”中的“ViewModel”
在“Silverlight”的项目中,其中有一个“ViewModel.cs”类。

1、“ViewModel.cs”类中有一个“DataPointsOfSeries”(实体对象),代码如下:
  public ObservableCollection<DataPointCollection> DataPointsOfSeries
  {
  get
  {  
  return _dataPointsOfSeries;
  }
  set
  {
  _dataPointsOfSeries = value;
  FirePropertyChanged("DataPointsOfSeries");
  }
  }

2、在“XAML”(Page.xaml)文件中
  <UserControl.DataContext>
  <local:ViewModel></local:ViewModel>
  </UserControl.DataContext>

  <vc:DataSeries RenderAs="Line" LightWeight="true" ShadowEnabled="false" LightingEnabled="false" MarkerSize="4" LineThickness="1" DataPoints="{Binding DataPointsOfSeries[0]}" />

问题一:通过“<UserControl.DataContext>”,“ViewModel.cs”类仿佛变成了“Page.xaml文件的后台文件(Page.xaml.cs)”,其中的“DataPointsOfSeries”实体对象可以直接被绑定,请问这是为什么???

问题二:“<UserControl.DataContext>”到底有什么作用呢?是不是“DataPointsOfSeries”实体对象如果在“Page.xaml.cs”中就不需要“<UserControl.DataContext>”了???

问题三:“Page.xaml.cs”中几乎没有逻辑了,全部被封装在了“ViewModel.cs”类中。从“Page.xaml.cs”调用“ViewModel.cs”类中方法,“<UserControl.DataContext>”就好像是一个桥梁似的?
 

------解决方案--------------------
问题一:通过“<UserControl.DataContext>”,“ViewModel.cs”类仿佛变成了“Page.xaml文件的后台文件(Page.xaml.cs)”,其中的“DataPointsOfSeries”实体对象可以直接被绑定,请问这是为什么???
===========
silverlight里的viewmodel还是在客户端的,等于把客户端分成了ui(xaml)和viewmodel两层。既然都在客户端,所以容易绑定。
mvvm的设计就是为了分离ui和业务逻辑,等于是把业务逻辑基本放在viewmodel里,通过属性和xaml绑定。
silverlight和mvvm我只了解大致原理,实战经验很少,只能说这么多。
------解决方案--------------------
你的问题都只涉及一个数据绑定的概念,Binding只能绑定到某个对象的属性,但是它却不知道该绑定到哪个对象的属性,而DataContext则是指定Binding的上下文,比如你例子中的UserControl的DataContext是ViewModel,那么在整个UserControl及其子控件(特定模板除外)中,绑定的属性都指向该ViewModel的属性;

Page.xaml.cs跟ViewModel是两个概念,如果你把DataPointsOfSeries集合写在Page.xaml.cs中的话,同样需要为Page指定绑定上下文DataContext,比如需要在构造函数中添加如下语句: this.DataContext = this;但是不建议这么做,感觉有点不伦不类

Page.xaml.cs本身就可以不需要逻辑,事实上你删掉Page.xaml.cs程序也能运行,用绑定可以完全实现UI和逻辑的分离

参考
http://msdn.microsoft.com/zh-cn/library/ms752347.aspx
------解决方案--------------------
这么说吧,Page.xaml最终也会被解释为Page类对象,而它跟Page.xaml.cs是属于同一个Page类对象的(注意看Page.xaml.cs的类定义包含限定符partial),这就是为什么你在Page.xaml.cs中编写代码时可以找到Page.xaml中控件的原因;而ViewModel是一个独立的对象模型,无法直接操作Page中控件,它只能通过绑定和数据上下文跟Page建立关系