这两天试了下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的更多相关文章

  1. ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet

    Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...

  2. 轻量级前端MVVM框架avalon - 初步接触

    迷你简单易用的MVVM框架 avalon的介绍http://rubylouvre.github.io/mvvm/ 按照作者的介绍,在HTML中添加绑定,在JS中用avalon.define定义View ...

  3. 轻量级前端MVVM框架avalon - 执行流程2

    接上一章 执行流程1 在这一大堆扫描绑定方法中应该会哪些实现? 首先我们看avalon能帮你做什么? 数据填充,比如表单的一些初始值,切换卡的各个面板的内容({{xxx}},{{xxx|html}}, ...

  4. JavaScript富应用MVC MVVM框架

    对框架的挑选 Ember.js.Backbone.js.Knockout.js.Spine.js.Batman.js , Angular.js 1. 轻量级的应用选择哪一个会比较好?2. 那一个比较简 ...

  5. MVVM框架思想

    1.MVVM是什么? M:模型 V:视图 VM:视图模型 简单理解:mvc是一个cell面向一个model开发 mvvm是一个cell面向一个viewModel开发, viewModel里面又包含mo ...

  6. 前端MVVM框架avalon - 模型转换1

    轻量级前端MVVM框架avalon - 模型转换(一) 接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: fun ...

  7. Vue中的MVVM框架

    ViewModel:数据双向绑定 场景: 针对具有复杂交互逻辑的前段应用 提供基础的架构抽象 通过Ajax数据持久化,保证前端用户体验  什么是vue.js? 是一个轻量级的mvvm框架 数据驱动+组 ...

  8. MVVM框架从WPF移植到UWP遇到的问题和解决方法

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...

  9. “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春

    火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...

随机推荐

  1. windows 与 Linux SOCKET通讯

    windows client 端口 // Def_win_client_socket_test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...

  2. HTML 学习杂记

    代码范例 <?php function testFunc1 () { echo 'testFunc1'; } $b = ; ?> <!DOCTYPE html PUBLIC &quo ...

  3. .net判断当前时间是否在工作时间段内

    整理代码,判断当前时间是否在配置的工作时间段内,代码如下: public static bool getTimeSpan(string _strWorkingDayAM, string _strWor ...

  4. HDU - 5658

    题意:给你一个字符串,给你Q次询问,每一次问你从l-r里有多少个回文串. 思路:len很小,所以直接遍历区间求就好了. /* gyt Live up to every day */ #include& ...

  5. hdu6069 多校Counting Divisors

    思路:对于n^k其实就是每个因子的个数乘了一个K.然后现在就变成了求每个数的每个质因子有多少个,但是比赛的时候只想到sqrt(n)的分解方法,总复杂度爆炸,就一直没过去,然后赛后看官方题解感觉好妙啊! ...

  6. ubuntu16下的/etc/resolv.conf重置的解决方案

    此文件存放了网络网关信息,重启后会刷新,刷新来源有两个可能 一个是根据文件中的resolvconf目录下的resolv.conf.d目录下的base文件 另一个来源是/etc/network/inte ...

  7. mysql (_mysql_exceptions.OperationalError) (1055, "Expression #1 of SELECT list is not in GROUP BY clause

    sudo gedit /etc/mysql/my.cnf在打开的my.cnf文件中添加 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 保存,退 ...

  8. c# devexpress 多个窗口

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. matlab中的结构体

    今天用imfinfo函数 >> K = imfinfo(‘colorbar_copy1.jpg’) K = 包含以下字段的 struct: Filename: 'E:\matlab\col ...

  10. AngularJs ng-repeat用法二$parent.$index

    我们在开发时时常会出现repeat嵌套使用的情况,此时会想获取父级repeat数组的下标可使用$parent.$index