理解WPF Stylet中Command=“{s:Action 方法名}“的设计与实现

前言

Stylet是我最近很喜欢使用的一个WPF框架,它的很多设计都体现了约定优于配置的思想。因此你会发现使用它非常方便,几乎不需要任何配置,开箱即用,只需知道它的一些约定即可。

查看Samples中Hello这个例子,只要在xaml中这样写:

 <Button Command="{s:Action SayHello}">Say Hello</Button>

然后你点击这个按钮,就会触发对应ViewModel中的SayHello方法,使用起来非常简单方便。这背后Stylet框架做了什么呢?让我们揭开它的神秘面纱吧!!

ActionExtension

先来看看ActionExtension,它位于Stylet.Xaml命名空间:

s:Action的第一阶段是XAML解析,这个阶段的核心任务是将XAML标记中的{s:Action SayHello}语法翻译成CommandAction实例。这个过程由ActionExtension标记扩展类完成,它是整个命令绑定系统的入口点。

当XAML解析器遇到{s:Action SayHello}时,会调用ActionExtension.ProvideValue方法:

HandleDependencyObject方法根据目标属性的类型进行分支处理:

对于命令绑定场景,CreateCommandAction方法创建CommandAction实例:

rootObject就是具有s:Action的页面:

View.ActionTarget

现在我们已经找到了View,但是想要触发的方法是在ViewModel上的,那么就要想办法找到对应的ViewModelStylet中是通过View.ActionTarget这个附加属性实现的。通过View.ActionTarget附加属性将ViewModel注入到可视化树中,使得后续阶段能够找到正确的命令执行目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值