今天翻译一段MVVM light tookit中的一些说明文档。
组件资源(来自翻译)
本toolkit包含了以下一些针对WPF、Sliverlight及WP7的组件和类库:
1、GalaSoft.MvvmLight类库
ViewModelBase 作为ViewModel的基类。
Messenger 类用于与应用程序传递消息。消息获取方只接受注册的消息类型。此外,可以指定消息类型,只在符合类型条件的情况下,才接收消息。这些消息可以是简单类型,也可以是复杂对象。还可以使用专门的消息类型,或者依据他们创建自己的类型。另外:
MessageBase,是一个简单的消息类,带有一些发送者的可选信息;
GenericMessage<T>,基于泛型的一种消息类型;
NotificationMessage,用于向接收者发送一条字符串的提醒;
NotificationMessage<T>,与前面的类似,用到了泛型。用于发送带参数的提醒;
NotificationMessageAction,发送提醒,支持回调事件;
NotificationMessageAction<T>,发送提醒,支持带泛型参数的回调事件;
DialogMessage,对话框式消息,接收者可以选择如何显示该对话框,比如标准提示框,自定义弹出框等等;
PropertyChangedMessage<T>,用于以非紧凑的方式广播属性修改事件。
Command 类优化了应用中的简单命令,在有没有泛型参数情况下都有效(RelayCommand<T> andRelayCommand)。更深层次的分析,建议阅读 Using RelayCommands in Silverlight and WPF
2、GalaSoft.MvvmLight.Extras 包含以下可选的类
EventToCommand behavior,允许绑定任何控件的任何事件到ICommand,这使得代码后置方式的编写命令更加简单,在最新的版本中,甚至可以直接从ViewModel捕获事件参数并进行处理;
DispatcherHelper class,一个用于创建多线程程序的轻量级帮助类。
3、Project Templates项目模板
4、Item templates文件模板,可以方便的在vs2010或blend中创建新文件,包括:ViewModel、View、ViewModelLocator(该类用于控制和管理ViewModel的引用)
5、代码碎片(Code snippets)可用于加速开发速度(仅针对VS2010)
mvvminpc 用于为ViewModel增加一个绑定属性
mvvmlocatorproperty 用于为ViewModelLocator增加一个ViewModel
mvvmpropa 为依赖对象增加一个附加属性(仅限WPF)
mvvmpropdp 为依赖对象增加一个依赖属性(仅限WPF)
mvvmslpropa 为依赖对象增加一个附加属性(仅限Silverlight)
mvvmslpropdp 为依赖对象增加一个依赖属性(仅限Silverlight)
翻译的不好请多见谅。
对翻译中的依赖属性及依赖对象不慎了了,特查资料作为附录:
定义: DependencyObject类:表示一个参与Silverlight依赖性属性系统的对象(MSDN);
服务和特征:
1、通过调用 Register 方法并将该方法的返回值作为公共静态字段存储在类中,即可注册依赖项属性。
2、附加属性承载支持。通过调用 RegisterAttached 方法并将该方法的返回值作为公共静态只读字段存储在类中,即可注册附加属性。然后,可以在从 DependencyObject 派生的任何类上设置附加属性。
服务和特征:
1、通过调用 Register 方法并将该方法的返回值作为公共静态字段存储在类中,即可注册依赖项属性。
2、附加属性承载支持。通过调用 RegisterAttached 方法并将该方法的返回值作为公共静态只读字段存储在类中,即可注册附加属性。然后,可以在从 DependencyObject 派生的任何类上设置附加属性。
3、都存在对应get和set方法,
为什么要引入依赖属性?
因为属性随着继承层次越来越多,子类的属性会发生膨胀,同时多数时候,子类并不更改父类属性值,没有必要每个子类对象都保存一个这样属性值,
所以引入了依赖属性
依赖属性的功能?
DependencyProperty有一个静态Dictionary成员,它负责存储所有的属性值,同时提供了读写方法。
不需要改变的属性都在这张系统唯一的表中,不需要每个子类对象保存一份
DependencyProperty与DependencyObject关系?
DependencyObject实际上是通过DependencyProperty来设置、查找类属性,它本身不存储
子类通过什么方式改变父类的属性?
首先DependencyProperty提供了对子类定制父类属性的支持,它提供了PropertyMetadata,
子类可以定义一个DependencyProperty的实例,通过修改PropertyMetadata可以设置子类的属性值
如何改变对象属性?
任何一个DependencyObject对象保存有一个EffectiveValues,用来存储对象改变的属性,
也就是说改变了的属性是存储再DependencyObject的对象里面的,不改变的存储在DependencyProperty中。
DependencyProperty中PropertyMetadata是支持子类改变父类的属性(注意:这里说的是子类的属性,而不是子类的实例,而DependencyProperty的静态Dictionary是保存不变的属性的
EffectiveValues中都有哪些值?
EffectiveValues中存的是属性改变值,因为改变的情况很多,所以这个值不是唯一的,其中包括BaseValue, AnimatedValue, CoercedValue, ExpressionValue
其中后面的比BaseValue的优先级高
改变对象属性值的优先级?
除了前面说的优先级问题,还涉及到BaseValue的确认问题,
BaseValue设置中本地设置,就是在xaml中直接给属性赋值或者在构造函数中给属性赋值优先级最高,其他的比如style, template, trigger等都比它优先级别低
返回属性到底返回的是什么值?
我们想获取属性的值,有这么多地方保存着,到底返回哪个呢?
wpf首先查找EffectiveValues,如果找到就返回,否则查找PropertyMetadata,如果失败查找DependencyProperty的静态Dictionary.
EffectiveValues与LocalValue什么关系?
前面已经解释了什么是LocalValue,其实LocalValue就是BaseValue中优先级最高的Local本地值
因为属性随着继承层次越来越多,子类的属性会发生膨胀,同时多数时候,子类并不更改父类属性值,没有必要每个子类对象都保存一个这样属性值,
所以引入了依赖属性
依赖属性的功能?
DependencyProperty有一个静态Dictionary成员,它负责存储所有的属性值,同时提供了读写方法。
不需要改变的属性都在这张系统唯一的表中,不需要每个子类对象保存一份
DependencyProperty与DependencyObject关系?
DependencyObject实际上是通过DependencyProperty来设置、查找类属性,它本身不存储
子类通过什么方式改变父类的属性?
首先DependencyProperty提供了对子类定制父类属性的支持,它提供了PropertyMetadata,
子类可以定义一个DependencyProperty的实例,通过修改PropertyMetadata可以设置子类的属性值
如何改变对象属性?
任何一个DependencyObject对象保存有一个EffectiveValues,用来存储对象改变的属性,
也就是说改变了的属性是存储再DependencyObject的对象里面的,不改变的存储在DependencyProperty中。
DependencyProperty中PropertyMetadata是支持子类改变父类的属性(注意:这里说的是子类的属性,而不是子类的实例,而DependencyProperty的静态Dictionary是保存不变的属性的
EffectiveValues中都有哪些值?
EffectiveValues中存的是属性改变值,因为改变的情况很多,所以这个值不是唯一的,其中包括BaseValue, AnimatedValue, CoercedValue, ExpressionValue
其中后面的比BaseValue的优先级高
改变对象属性值的优先级?
除了前面说的优先级问题,还涉及到BaseValue的确认问题,
BaseValue设置中本地设置,就是在xaml中直接给属性赋值或者在构造函数中给属性赋值优先级最高,其他的比如style, template, trigger等都比它优先级别低
返回属性到底返回的是什么值?
我们想获取属性的值,有这么多地方保存着,到底返回哪个呢?
wpf首先查找EffectiveValues,如果找到就返回,否则查找PropertyMetadata,如果失败查找DependencyProperty的静态Dictionary.
EffectiveValues与LocalValue什么关系?
前面已经解释了什么是LocalValue,其实LocalValue就是BaseValue中优先级最高的Local本地值