“MVVM”中的“ViewModel”

starryit 2012-03-21 08:35:49
在“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>”就好像是一个桥梁似的?

...全文
158 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
emchem 2012-05-18
  • 打赏
  • 举报
回复
搞不懂啊,其实我也有好多疑问!ViewModel的生命周期是怎样呢?比如我从A页面导航到B页面,再返回到A页面,A页面对应的ViewModel是否要重新Load一遍呢,我想保存导航之前的ViewModel的信息,该如何操作呢?盼高手解释一下,不胜感激!
starrycheng 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 duanzilin 的回复:]

你的问题都只涉及一个数据绑定的概念,Binding只能绑定到某个对象的属性,但是它却不知道该绑定到哪个对象的属性,而DataContext则是指定Binding的上下文,比如你例子中的UserControl的DataContext是ViewModel,那么在整个UserControl及其子控件(特定模板除外)中,绑定的属性都指向该ViewModel的属性;

Page.xaml.cs跟Vie……
[/Quote]

谢谢咯。。。
沝林 2012-03-22
  • 打赏
  • 举报
回复
这么说吧,Page.xaml最终也会被解释为Page类对象,而它跟Page.xaml.cs是属于同一个Page类对象的(注意看Page.xaml.cs的类定义包含限定符partial),这就是为什么你在Page.xaml.cs中编写代码时可以找到Page.xaml中控件的原因;而ViewModel是一个独立的对象模型,无法直接操作Page中控件,它只能通过绑定和数据上下文跟Page建立关系
沝林 2012-03-22
  • 打赏
  • 举报
回复
你的问题都只涉及一个数据绑定的概念,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
starrycheng 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hzzasdf 的回复:]

问题一:通过“<UserControl.DataContext>”,“ViewModel.cs”类仿佛变成了“Page.xaml文件的后台文件(Page.xaml.cs)”,其中的“DataPointsOfSeries”实体对象可以直接被绑定,请问这是为什么???
===========
silverlight里的viewmodel还是在客户端的,等于把客户端分成了ui(xaml)和view……
[/Quote]

嗯,谢谢。期待高手回答。。。
starrycheng 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 duanzilin 的回复:]

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

谢谢。
那么可不可以再请教一下,“后台中的控件(比如,Combobox)的DataSource属性”和前台的“Bingnding”方法有什么不同呢?又有什么联系?
  • 打赏
  • 举报
回复
问题一:通过“<UserControl.DataContext>”,“ViewModel.cs”类仿佛变成了“Page.xaml文件的后台文件(Page.xaml.cs)”,其中的“DataPointsOfSeries”实体对象可以直接被绑定,请问这是为什么???
===========
silverlight里的viewmodel还是在客户端的,等于把客户端分成了ui(xaml)和viewmodel两层。既然都在客户端,所以容易绑定。
mvvm的设计就是为了分离ui和业务逻辑,等于是把业务逻辑基本放在viewmodel里,通过属性和xaml绑定。
silverlight和mvvm我只了解大致原理,实战经验很少,只能说这么多。
starrycheng 2012-03-21
  • 打赏
  • 举报
回复
这是“MVVM”,应该还有一个实体类对象对吧。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧