今天偶然知道一款叫做stylet的MVVM框架,挺小巧的,特别是它的命令触发方式,简单粗暴,让人感觉很巴适,现在我做一个简单的demo来顺便来分享给大家。
本地创建一个WPF项目,此处我使用.NET 8来创建。然后引用stylet最新的nuget包。
![0](https://img-blog.csdnimg.cn/img_convert/df1e5bdaaffb5547769328d7dc0feb23.png)
然后删掉App.xaml里面自带的启动项
![0](https://img-blog.csdnimg.cn/img_convert/9c544552b4de86ed68ed03dc9efd7cef.png)
删掉以后:
![0](https://img-blog.csdnimg.cn/img_convert/2c4b6ec3e083501337af4346546edf78.png)
stylet使用View和ViewModel强制性一一对应的关系,比如说,页面A,必须要写成AView和AViewModel的形式,才能识别。所以默认的MainWindow咱们可以干掉,重新创建一个页面,例如 MainView:
![0](https://img-blog.csdnimg.cn/img_convert/7f9e7977481ceb58070aa55ff45af810.png)
再创建一个对应的ViewModel类。它的ViewModel类型,需要继承自Stylet.Screen
![0](https://img-blog.csdnimg.cn/img_convert/359543dc7a4655af3ae47773219527c8.png)
然后需要创建一个启动项,默认类名称为 Bootstrapper,它继承自Bootstrapper,T指的是启动项对应的ViewModel。启动项Bootstrapper里面还要重写IOC容器进行服务注册等有关。
![0](https://img-blog.csdnimg.cn/img_convert/dab3b7d812b759cbb09b84516a0e97ab.png)
在App.xaml.cs文件内,提供对启动项Bootstrapper的声明和使用。
![0](https://img-blog.csdnimg.cn/img_convert/b44e74d2440cbac2ac4c06a5b20c41bd.png)
如果以上步骤都没做错的话,那么现在应该是可以正常启动了。
![0](https://img-blog.csdnimg.cn/img_convert/10c5a4eae1f0e261231b434b6b7f9028.png)
接下来,MVVM的实现,先搞2个简单的控件,一个提供属性MVVM实现,一个提供点击Command命令实现。需要注意的是,stylet的Command命令或者其他自定义命令实现,不是直接Bingding了,而是使用Action来绑定。
![0](https://img-blog.csdnimg.cn/img_convert/ee46868b754064cbf2d3748c9fe54127.png)
ViewModel里面,看下具体代码,和平常大家使用的MVVM双向绑定,有点差异大地方,我圈起来了。
![0](https://img-blog.csdnimg.cn/img_convert/a6aff74c1e5a99d3a94c710c9872fa57.png)
启动程序,原始效果如下所示
![0](https://img-blog.csdnimg.cn/img_convert/fe348bd741befb4bd16e66ae779cbac3.png)
点击按钮以后,自动进入到指定的方法里面,把Message值改变,同时前端展示的值也跟着变了。
![0](https://img-blog.csdnimg.cn/img_convert/ec280de6f0e8ed88ecf51503fdb54e33.png)
接下来说一下它的IOC容器来实现依赖注入。先创建一个测试用的服务类,里面就一个方法,获取消息,返回“Stylet 服务注入~ ”字符串。
![0](https://img-blog.csdnimg.cn/img_convert/e3ab2e7756025fc7880f6035998b5c91.png)
启动项的ConfigureIoC方法里面,提供服务的注册。不过它自带的IOC容器可选生命周期比较有限,没有prism或者castle或者asp.netcore自带的容器丰富。不过注册的写法看起来很直观,builder.Bind<接口>().To<实现>().生命周期模式。
![0](https://img-blog.csdnimg.cn/img_convert/0455b0b0c8caaf874cf5a1b18948ae24.png)
通过构造函数注入进来,然后在命令方法里面直接调用,并把返回值提供给Message用于展示。
![0](https://img-blog.csdnimg.cn/img_convert/211733fa92e14f8ae0cb52aac64ce4cc.png)
运行程序,并点击按钮,可以看到返回了GetMessage()里面返回的信息,说明服务注册和注入使用是成功的。
![0](https://img-blog.csdnimg.cn/img_convert/e1ca1b5aa9b09d5ffe34a9bada0750c4.png)
如果有需要以上demo源码,可以在我个人公众号【Dotnet Dancer】后台回复 【stylet】即可获取。