MVVM Light tookit 学习笔记3

今天翻译一段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 派生的任何类上设置附加属性。
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本地值




你可能感兴趣的:(学习笔记)