在“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>”就好像是一个桥梁似的?
    

解决方案 »

  1.   

    这是“MVVM”,应该还有一个实体类对象对吧。
      

  2.   

    问题一:通过“<UserControl.DataContext>”,“ViewModel.cs”类仿佛变成了“Page.xaml文件的后台文件(Page.xaml.cs)”,其中的“DataPointsOfSeries”实体对象可以直接被绑定,请问这是为什么???
    ===========
    silverlight里的viewmodel还是在客户端的,等于把客户端分成了ui(xaml)和viewmodel两层。既然都在客户端,所以容易绑定。
    mvvm的设计就是为了分离ui和业务逻辑,等于是把业务逻辑基本放在viewmodel里,通过属性和xaml绑定。
    silverlight和mvvm我只了解大致原理,实战经验很少,只能说这么多。
      

  3.   

    你的问题都只涉及一个数据绑定的概念,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
      

  4.   

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

  5.   


    谢谢。
    那么可不可以再请教一下,“后台中的控件(比如,Combobox)的DataSource属性”和前台的“Bingnding”方法有什么不同呢?又有什么联系?
      

  6.   

    搞不懂啊,其实我也有好多疑问!ViewModel的生命周期是怎样呢?比如我从A页面导航到B页面,再返回到A页面,A页面对应的ViewModel是否要重新Load一遍呢,我想保存导航之前的ViewModel的信息,该如何操作呢?盼高手解释一下,不胜感激!