轻量级MVVM框架 Stylet
这两天试了下Stylet框架,这个框架虽然很小,但是功能齐全,简化了很多MVVM的代码,比如Command,对Dialog,MessageBox都有很好的支持。
开源地址 https://github.com/canton7/Stylet
新建一个WPF项目,添加NuGet引用

安装完成后会自动添加一个BootStrapper文件,这个文件是项目启动文件
public class Bootstrapper : Bootstrapper<ShellViewModel>
BootStrapper<ShellViewModel>,这个是对应的启动窗体,Stylet是根据ViewModel去找对应的View去显示,ViewModel与View的名称要一致。
我们新添加一个窗体,界面上放一个文本和三个按钮,来体验下Stylet的绑定,命令,显示消息框和子窗体。
<Window x:Class="StyletTestNew.Pages.Window1View"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:StyletTestNew.Pages"
mc:Ignorable="d"
xmlns:s="https://github.com/canton7/Stylet"
Title="Window1" Height="450" Width="800" d:DataContext="{d:DesignInstance local:Window1ViewModel}"> <Grid>
<TextBox HorizontalAlignment="Left" Height="23" Margin="106,100,0,0" TextWrapping="Wrap"
Text="{Binding FName,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>
<Button Content="ChangeTxt" HorizontalAlignment="Left" Margin="365,179,0,0"
VerticalAlignment="Top" Width="75" Command="{s:Action BtnCommand}"/>
<Button Content="ShowMessage" HorizontalAlignment="Left" Command="{s:Action ShowMessage}"
Margin="533,179,0,0" VerticalAlignment="Top" Width="75"/>
<Button Content="ShowDialog" HorizontalAlignment="Left" Command="{s:Action ShowDialog}"
Margin="649,179,0,0" VerticalAlignment="Top" Width="75"/> </Grid>
</Window>
添加ViewModel,添加对应的属性和方法
public class Window1ViewModel : Screen
{
private IWindowManager _windowManger;
private ShellViewModel _ChildDialog; public Window1ViewModel(IWindowManager windowManager,ShellViewModel ChildDialog)
{
_windowManger = windowManager;
_ChildDialog = ChildDialog;
} public string FName { get; set; } = "ly"; public void BtnCommand()
{
FName = DateTime.Now.ToString();
} public bool CanBtnCommand
{
get
{
return !string.IsNullOrWhiteSpace(FName);
}
} public void ShowMessage() => _windowManger.ShowMessageBox(FName);
public void ShowDialog() => _windowManger.ShowDialog(_ChildDialog); }
我们可以看到Button绑定的是方法而不是命令对象


Stylet也可以像Command一样做CanCommandExecute的功能。
比如,文本框的Text为空,则不可以点按钮
public bool CanBtnCommand
{
get
{
return !string.IsNullOrWhiteSpace(FName);
}
} public void BtnCommand()
{
FName = DateTime.Now.ToString();
}
在按钮绑定的方法名称前加个Can属性,实现的功能和CanCommandExecute功能一样。
大家发现我的ViewModel中没有实现INotifyPropertyChanged接口,这时,我们需要nuget一个类库PropertyChanged.Fody。Stylet完美支持PropertyChanged.Fody,不需要我们在去实现下INotifyPropertyChanged接口了。

关于PropertyChanged.Fody,大家可以看这篇文章,介绍的蛮详细的。
https://www.cnblogs.com/cqgis/p/6360231.html
Stylet也提供了ShowMessage和ShowDialog功能。IWindowManager接口内包含这些方法。

Stylet通过IOC依赖注入,将实例化的WindowManager对象传入ViewModel中。这样我们就可以在ViewModel中使用这些功能。
private IWindowManager _windowManger;
private ShellViewModel _ChildDialog; public Window1ViewModel(IWindowManager windowManager,ShellViewModel ChildDialog)
{
_windowManger = windowManager;
_ChildDialog = ChildDialog;
}
public void ShowMessage() => _windowManger.ShowMessageBox(FName);
public void ShowDialog() => _windowManger.ShowDialog(_ChildDialog);
其中,ShowDialog时,传入的是ShellViewModel,Stylet通过ViewModel去找到了对应的View去显示。
先写到这!
轻量级MVVM框架 Stylet的更多相关文章
- ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet
Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...
- 轻量级前端MVVM框架avalon - 初步接触
迷你简单易用的MVVM框架 avalon的介绍http://rubylouvre.github.io/mvvm/ 按照作者的介绍,在HTML中添加绑定,在JS中用avalon.define定义View ...
- 轻量级前端MVVM框架avalon - 执行流程2
接上一章 执行流程1 在这一大堆扫描绑定方法中应该会哪些实现? 首先我们看avalon能帮你做什么? 数据填充,比如表单的一些初始值,切换卡的各个面板的内容({{xxx}},{{xxx|html}}, ...
- JavaScript富应用MVC MVVM框架
对框架的挑选 Ember.js.Backbone.js.Knockout.js.Spine.js.Batman.js , Angular.js 1. 轻量级的应用选择哪一个会比较好?2. 那一个比较简 ...
- MVVM框架思想
1.MVVM是什么? M:模型 V:视图 VM:视图模型 简单理解:mvc是一个cell面向一个model开发 mvvm是一个cell面向一个viewModel开发, viewModel里面又包含mo ...
- 前端MVVM框架avalon - 模型转换1
轻量级前端MVVM框架avalon - 模型转换(一) 接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: fun ...
- Vue中的MVVM框架
ViewModel:数据双向绑定 场景: 针对具有复杂交互逻辑的前段应用 提供基础的架构抽象 通过Ajax数据持久化,保证前端用户体验 什么是vue.js? 是一个轻量级的mvvm框架 数据驱动+组 ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春
火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...
随机推荐
- 含有选择器的 bootstrap菜单
var menu = new BootstrapMenu('#jsmind_container jmnode:not(.root)', { actions: [{ name: '展开节点', onCl ...
- vue获取DOM元素并设置属性
这里我想到了2个方法: 方法一: 直接给相应的元素加id,然后再document.getElementById("id");获取,然后设置相应属性或样式 方法二: 使用ref,给相 ...
- https传输过程嗅探
C1->浏览器告知服务器自身的信息 length = 165 a5 16 03 01 00 A0 01 00 00 9C 03 03 5E 1C 37 CD 40 [ ^ 7 @] B6 4A ...
- 关于syslog日志功能详解 事件日志分析、EventLog Analyzer
关于syslog日志功能详解 事件日志分析.EventLog Analyzer 一.日志管理 保障网络安全 Windows系统日志分析 Syslog日志分析 应用程序日志分析 Windows终端服务器 ...
- MySQL数据库innodb_rollback_on_timeout默认值的危害?
http://www.ywnds.com/?p=9560 一.innodb_rollback_on_timeout变量 有时侯会发生事务超时的情况,MySQL会返回类似这样的错误: 1 ERROR ...
- GUI的最终选择Tkinter模块初级篇
一.Tkinter模块的基本使用 1)实例化窗口程序 import tkinter as tk app = tk.Tk() app.title("FishC Demo") app. ...
- python学习 day18 (3月25日)---( 面向对象浅析)
面向对象思想: 字典表示对象: 不是太好 因为 变量 得一个个的赋值改值 {'name':'alex','blood':20,'attack':1,'sex':'不'} {'name':'太亮','b ...
- 一波水题 MZOJ 1035: 贝克汉姆
#include <bits/stdc++.h> using namespace std; ; int n,m; int v[N],w[N],f[N]; int main() { scan ...
- spring+springMVC+mybatis+maven+mysql环境搭建(一)
环境搭建是最基础的,但是发现平时很多时候大家都是ctrl c+ctrl v,这样对于很多细节完全不清楚,来,一起深入了解下 一.准备工作 首先得准备好maven.mysql啥的,这些略... 并且my ...
- (9)How to take a picture of a black hole
https://www.ted.com/talks/katie_bouman_what_does_a_black_hole_look_like/transcript 00:13In the movie ...