摘要:Stylet是我最近很喜欢使用的一个WPF框架,它的很多设计都体现了约定优于配置的思想。因此你会发现使用它非常方便,几乎不需要任何配置,开箱即用,只需知道它的一些约定即可。
Stylet是我最近很喜欢使用的一个WPF框架,它的很多设计都体现了约定优于配置的思想。因此你会发现使用它非常方便,几乎不需要任何配置,开箱即用,只需知道它的一些约定即可。
查看Samples中Hello这个例子,只要在xaml中这样写:
然后你点击这个按钮,就会触发对应ViewModel中的SayHello方法,使用起来非常简单方便。这背后Stylet框架做了什么呢?让我们揭开它的神秘面纱吧!!
先来看看,它位于命名空间:默认值:InitialActionTarget(一个特殊的标记对象)
继承性:FrameworkPropertyMetadataOptions.Inherits确保属性值可以沿着可视化树向下传递
当View.Model属性被设置时,会触发PropertyChangedCallback,通过ViewManager建立视图和ViewModel的关联。├── UserControl (继承Window的View.ActionTargetProperty)
│ ├── Button (继承UserControl的View.ActionTargetProperty)
│ └── TextBox (继承UserControl的View.ActionTargetProperty)
└── Grid (继承Window的View.ActionTargetProperty)
但是现在还没完成绑定,只是绑定的一端,还需要设置将这个属性绑定到哪里。
BindingOperations.SetBinding(this, targetProperty, multiBinding);将ActionBase的targetProperty依赖属性绑定到View.ActionTargetProperty拿到是否可以执行对应命令的属性:
Expressions.MemberExpression propertyAccess = Expressions.Expression.Property(targetExpression, guardPropertyInfo);
this.guardPropertyGetter = Expressions.Expression.Lambda
这段代码在,生成一个无参、返回 bool(Func第一行相当于就是使用这个newTarget对象,第二行就是访问这个newTarget对象的CanSayHello属性,相当于Expression.Lambda将表达式树包装成一个无参Lambda表达式(形如 => newTarget.CanSayHello)。.Compile把表达式树编译成可执行IL ,生成一个静态缓存的委托然后调用this.UpdateCanExecute;触发CanExecuteChanged事件,就会执行CanExecute方法,在这个方法中就使用到了刚刚生成的获取newTarget.CanSayHello
这一次返回true,命令可以执行。
当我点击按钮的时候,如果命令可以执行,就会执行Execute方法
这样就会执行ViewModel中对应的方法。
以上就是个人对于WPF Stylet中Command="{s:Action SayHello}"的设计与实现的理解。
来源:opendotnet