一、简介

Stylet是基于WPF的一款MVVM组件,虽然WPF本身是自带MVVM功能的,但实现起来不是很方便 ,通过Stylet,用户可以用很少的代码就能享受MVVM带来的舒适体验。

目前Stylet支持:.Net Framerwork 4.5、.Net Core 3.0、.Net 5以上版本。

二、搭建基本框架

1、新建项目工程后,通过Nuget添加以下几个组件:

2、新建窗口MainShellView,新建类MainShellViewModel

public class MainShellViewModel : Stylet.Screen
{
}

Stylet对视图和模型有命名要求,必须为XXXView、XXXViewModel形式成对出现。

3、新建类Bootstrapper

  1. public class Bootstrapper : Bootstrapper<MainShellViewModel>
  2. {
  3. protected override void ConfigureIoC(IStyletIoCBuilder builder)
  4. {
  5. // Configure the IoC container in here
  6. }
  7.  
  8. protected override void Configure()
  9. {
  10. // Perform any other configuration before the application starts
  11. }
  12. }

4、编辑App.xmal,删除StartupUri="MainWindow.xaml",如下:

  1. <Application x:Class="NiceComponents.App"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:local="clr-namespace:NiceComponents"
  5. xmlns:s="https://github.com/canton7/Stylet">
  6. <Application.Resources>
  7. <s:ApplicationLoader>
  8. <s:ApplicationLoader.Bootstrapper>
  9. <local:Bootstrapper />
  10. </s:ApplicationLoader.Bootstrapper>
  11. </s:ApplicationLoader>
  12. </Application.Resources>
  13. </Application>

然后编译运行即可。

此时项目根目录的MainWindow.xaml已经没有用了,可以删除。

三、基本用法

1、绑定

  1. XMAL
  2. <ProgressBar Value="{Binding ProgressValue}" Visibility="{Binding ProgressVisibility}" Maximum="100" />
  3. <Slider Value="{Binding ProgressValue}" Maximum="100" />
  4. <CheckBox Content="Show" IsChecked="{Binding IsProgressShow}"/>
  5. CODE
  6. public class MainShellViewModel : Stylet.Screen
  7. {
  8. public int ProgressValue { get; set; }
  9. public bool IsProgressShow { get; set; } = true;
  10. public Visibility ProgressVisibility => IsProgressShow ? Visibility.Visible : Visibility.Collapsed;
  11. }

以上代码实现一个ProgressBar 控件和一个Slider 控件的联动,同时通过一个CheckBox控件来控制ProgressBar 是否显示,代码非常简洁,充分体现了MVVM的优雅。

2、命令

  1. XMAL
  2. <TextBox Text="{Binding InputString, UpdateSourceTrigger=PropertyChanged}"/>
  3. <TextBlock Text="{Binding OutputString}"/>
  4. <Button Content="Show" Command="{s:Action ShowString}" />
  5. CODE
  6. public class MainShellViewModel : Stylet.Screen
  7. {
  8. public string InputString { get; set; }
  9. public string OutputString { get; set; }
  10. public void ShowString()
  11. {
  12. OutputString = $"Your string is : {InputString}";
  13. }
  14. public bool CanShowString => !string.IsNullOrEmpty(InputString);
  15. }

通过Command="{s:Action ShowString}"来调用后台的方法。在方法名称前加一个Can表示防卫属性,通过CanShowString属性可以控制该按钮的IsEnabled状态。

某些控件没有Command属性,也是用同样方法调用:

  1. <TextBox TextChanged="{s:Action TextChanged}" IsEnabled={Binding IsTextBoxEnabled} />
  2.  
  3. public void TextChanged()
  4. {
  5. Debug.WriteLine("TextChanged");
  6. }

此时,防卫属性是不能用的,如果需要,可以定义一个普通的bool类型变量Binding到控件的IsEnabled属性即可。

3、绑定列表

  1. XMAL
  2. <ListBox ItemsSource="{Binding StringList}" SelectedItem="{Binding SelectedString}" />
  3. <Button Content="Add String" Command="{s:Action AddString}" />
  4. <Button Content="Delete String" Command="{s:Action DeleteString}" />
  5.  
  6. CODE
  7. public class MainShellViewModel : Stylet.Screen
  8. {
    public List<string> StringList { get; set; } = new List<string>();
  9. public string SelectedString { get; set; }
  10. public void AddString()
  11. {
  12. StringList.Add($"Item{StringList.Count + 1}");
  13. }
  14. public void DeleteString()
  15. {
  16. StringList.Remove(SelectedString);
  17. }
  18. public bool CanDeleteString => SelectedString != null;
  19. }

WPF中有不少控件绑定的数据类型是列表,比如:ListBox、ComboBox、DataGrid等。以上代码实现一个列表的增加和删除。

运行以上代码,你会发现程序不能正确运行,通过Debug会发现AddString方法已经执行了,StringList列表数量也增加了,但界面上的ListBox没有变化。对于MVVM框架而言,这是一个非常常见的问题,也是非常容易犯的错误。

当我们改变一个对象时,Fody框架会自动调用PropertyChanged方法,前台收到PropertyChanged事件才会更新界面,对于List而言,调用其Add方法只是改变了对象的属性,并没有改变对象本身,所以没有产生PropertyChanged事件。

要解决这个问题,可以采用BindingList来取代List,该类在内容发生变化时也会发送PropertyChanged事件,另外,Stylet框架专门提供一个BindableCollection类来装载需要动态绑定的列表,应优先使用这个类。

以上代码下载地址:NiceComponents · Bruce/Learn WPF - 码云 - 开源中国 (gitee.com)

下一节,将会介绍一些Stylet框架的更复杂一些应用。

WPF优秀组件推荐之Stylet(一)的更多相关文章

  1. WPF优秀组件推荐之Stylet(二)

    上一篇文章介绍了Stylet的一些基本功能,本篇将介绍一些深入一点的功能. 依赖注入 在Bootstrapper 类中注入需要的对象: public class Bootstrapper : Boot ...

  2. WPF优秀组件推荐之MahApps

    概述 MahApps是一套基于WPF的界面组件,通过该组件,可以使用较小的开发成本实现一个相对很好的界面效果. 官方网站:MahApps.Metro - Home 开源代码:MahApps · Git ...

  3. WPF优秀组件推荐之LiveCharts

    概述 LiveCharts是一个比较漂亮的WPF图表控件,在数据变化时还会有动画切换的效果,并且样式也可以控制. 官方网站:Live Charts (lvcharts.net) 开源代码:GitHub ...

  4. WPF优秀组件推荐之FreeSpire

    概述 Spire是一套可以轻松处理Word.Excel和PDF的商业组件,需要收费,但是他有一套对应的免费组件FreeSpire可以使用,免费组件在功能上有一些限制(比如:excel的sheet数量不 ...

  5. JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)

    前言:上篇 JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐 分享了几个项目中比较常用的组件,引起了许多园友的关注.这篇还是继续,因为博主觉得还有几个非常简单.实用的组件,实在不愿自己 ...

  6. 优秀工具推荐:超实用的 CSS 库,样板和框架

    当启动一个新的项目,使用 CSS 框架或样板,可以帮助您节省大量的时间.在这篇文章中,我编译整理了我最喜欢的 CSS 样板,框架和库,帮助你在建立网站或应用程序时更加高效. 您可能感兴趣的相关文章 精 ...

  7. 【转】JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)

    前言:上篇 JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐 分享了几个项目中比较常用的组件,引起了许多园友的关注.这篇还是继续,因为博主觉得还有几个非常简单.实用的组件,实在不愿自己 ...

  8. HP-Socket国产优秀socket通信组件推荐

    来源:http://blog.csdn.net/clb929/article/details/51085983 * HP-Socket 官方网站:http://www.jessma.org * HP- ...

  9. vue组件推荐

    Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正 ...

随机推荐

  1. Redis 源码简洁剖析 04 - Sorted Set 有序集合

    Sorted Set 是什么 Sorted Set 命令及实现方法 Sorted Set 数据结构 跳表(skiplist) 跳表节点的结构定义 跳表的定义 跳表节点查询 层数设置 跳表插入节点 zs ...

  2. python 中 *args he **kwargs的区别

    ''' 一 *args 和 **kwargs 的区别? *args 表示任意个 无名参数, 类型是元祖 tuple. **kwargs 表示的是关键字的参数 传入的参数是 dict 类型. 当*和** ...

  3. react-motion 动画案例介绍

    第一个案例:Motion组件 import React,{Component} from 'react'; import {Motion,spring,presets} from 'react-mot ...

  4. react react-smooth动画

    首先自然而然的安装一下依赖: npm install react-smooth --save-dev 接下来就是组件代码啦: import React, { Component, Fragment } ...

  5. 「JOISC 2016 Day 1」棋盘游戏

    「JOISC 2016 Day 1」棋盘游戏 先判无解:第1,3行有连续的空格或四个角有空格. 然后可以发现有解的情况第1,3行可以在任意时间摆放. 对于某一列,若第2行放有棋子,那么显然可以把棋盘分 ...

  6. Execution default-resources of goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources failed.

    说明 今天发现这个错误,然后整体检查了一下代码,没有发现任何错误,最后没法只有来一步一步排查. 解决 确定pom文件是否有问题 如上图,有红色波浪线,代表错误,请检查并解决,还有版本是否冲突,最好把不 ...

  7. 使用UrlConnection请求一个url地址获取内容

    访问网络需要加Internet权限:android.permission.INTERNET 使用UrlConnection请求一个url地址获取内容:             //1.创建一个Url对 ...

  8. udp的第一个例子

    import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j ...

  9. Ubuntu18配置静态IP地址

    1. 记住网卡名称 ifconfig 2. 记住网关地址 netstat -rn 3. 配置静态IP 注意:Ubuntu18固定IP的方式跟Ubuntu18之前版本的的配置方式不同, Ubuntu18 ...

  10. Windows系统禁止自动更新

    Windows + R键 输入services.msc(服务管理窗口) 找到Windows Update 停止且禁用 恢复->第一次失败 无操作 Windows + r 输入gpedit.msc ...