WPF优秀组件推荐之Stylet(一)
一、简介
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
public class Bootstrapper : Bootstrapper<MainShellViewModel>
{
protected override void ConfigureIoC(IStyletIoCBuilder builder)
{
// Configure the IoC container in here
} protected override void Configure()
{
// Perform any other configuration before the application starts
}
}
4、编辑App.xmal,删除StartupUri="MainWindow.xaml",如下:

<Application x:Class="NiceComponents.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:NiceComponents"
xmlns:s="https://github.com/canton7/Stylet">
<Application.Resources>
<s:ApplicationLoader>
<s:ApplicationLoader.Bootstrapper>
<local:Bootstrapper />
</s:ApplicationLoader.Bootstrapper>
</s:ApplicationLoader>
</Application.Resources>
</Application>
然后编译运行即可。
此时项目根目录的MainWindow.xaml已经没有用了,可以删除。
三、基本用法
1、绑定
XMAL:
<ProgressBar Value="{Binding ProgressValue}" Visibility="{Binding ProgressVisibility}" Maximum="100" />
<Slider Value="{Binding ProgressValue}" Maximum="100" />
<CheckBox Content="Show" IsChecked="{Binding IsProgressShow}"/> CODE:
public class MainShellViewModel : Stylet.Screen
{
public int ProgressValue { get; set; }
public bool IsProgressShow { get; set; } = true;
public Visibility ProgressVisibility => IsProgressShow ? Visibility.Visible : Visibility.Collapsed;
}
以上代码实现一个ProgressBar 控件和一个Slider 控件的联动,同时通过一个CheckBox控件来控制ProgressBar 是否显示,代码非常简洁,充分体现了MVVM的优雅。
2、命令
XMAL:
<TextBox Text="{Binding InputString, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Text="{Binding OutputString}"/>
<Button Content="Show" Command="{s:Action ShowString}" /> CODE:
public class MainShellViewModel : Stylet.Screen
{
public string InputString { get; set; }
public string OutputString { get; set; }
public void ShowString()
{
OutputString = $"Your string is : {InputString}";
}
public bool CanShowString => !string.IsNullOrEmpty(InputString);
}
通过Command="{s:Action ShowString}"来调用后台的方法。在方法名称前加一个Can表示防卫属性,通过CanShowString属性可以控制该按钮的IsEnabled状态。
某些控件没有Command属性,也是用同样方法调用:
<TextBox TextChanged="{s:Action TextChanged}" IsEnabled={Binding IsTextBoxEnabled} />
public void TextChanged()
{
Debug.WriteLine("TextChanged");
}
此时,防卫属性是不能用的,如果需要,可以定义一个普通的bool类型变量Binding到控件的IsEnabled属性即可。
3、绑定列表
XMAL:
<ListBox ItemsSource="{Binding StringList}" SelectedItem="{Binding SelectedString}" />
<Button Content="Add String" Command="{s:Action AddString}" />
<Button Content="Delete String" Command="{s:Action DeleteString}" /> CODE:
public class MainShellViewModel : Stylet.Screen
{
public List<string> StringList { get; set; } = new List<string>();
public string SelectedString { get; set; }
public void AddString()
{
StringList.Add($"Item{StringList.Count + 1}");
}
public void DeleteString()
{
StringList.Remove(SelectedString);
}
public bool CanDeleteString => SelectedString != null;
}
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(一)的更多相关文章
- WPF优秀组件推荐之Stylet(二)
上一篇文章介绍了Stylet的一些基本功能,本篇将介绍一些深入一点的功能. 依赖注入 在Bootstrapper 类中注入需要的对象: public class Bootstrapper : Boot ...
- WPF优秀组件推荐之MahApps
概述 MahApps是一套基于WPF的界面组件,通过该组件,可以使用较小的开发成本实现一个相对很好的界面效果. 官方网站:MahApps.Metro - Home 开源代码:MahApps · Git ...
- WPF优秀组件推荐之LiveCharts
概述 LiveCharts是一个比较漂亮的WPF图表控件,在数据变化时还会有动画切换的效果,并且样式也可以控制. 官方网站:Live Charts (lvcharts.net) 开源代码:GitHub ...
- WPF优秀组件推荐之FreeSpire
概述 Spire是一套可以轻松处理Word.Excel和PDF的商业组件,需要收费,但是他有一套对应的免费组件FreeSpire可以使用,免费组件在功能上有一些限制(比如:excel的sheet数量不 ...
- JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)
前言:上篇 JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐 分享了几个项目中比较常用的组件,引起了许多园友的关注.这篇还是继续,因为博主觉得还有几个非常简单.实用的组件,实在不愿自己 ...
- 优秀工具推荐:超实用的 CSS 库,样板和框架
当启动一个新的项目,使用 CSS 框架或样板,可以帮助您节省大量的时间.在这篇文章中,我编译整理了我最喜欢的 CSS 样板,框架和库,帮助你在建立网站或应用程序时更加高效. 您可能感兴趣的相关文章 精 ...
- 【转】JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)
前言:上篇 JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐 分享了几个项目中比较常用的组件,引起了许多园友的关注.这篇还是继续,因为博主觉得还有几个非常简单.实用的组件,实在不愿自己 ...
- HP-Socket国产优秀socket通信组件推荐
来源:http://blog.csdn.net/clb929/article/details/51085983 * HP-Socket 官方网站:http://www.jessma.org * HP- ...
- vue组件推荐
Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正 ...
随机推荐
- 回顾 Flutter 2021 重要时刻,奉上虎年红包封面喜迎新年!
2021 年,Flutter 正式进入 2.x 系列的正式版发布,年初的 Flutter 2 的发布 打开了一个新的"格局",为 Flutter 的加入了第五大特色--「可移植性」 ...
- .NET 5.0 Docker 镜像 错误修复方法
在给eshopondapr 打镜像的时候碰到了3个错误 1.restore: Received an unexpected EOF or 0 bytes from the transport stre ...
- SpringBoot + Log4j2使用配置 (转)
前言 后台程序开发及上线时,一般都会用到Log信息打印及Log日志记录,开发时通过Log信息打印可以快速的定位问题所在,帮助我们快捷开发.程序上线后如遇到Bug或错误,此时则需要日志记录来查找发现问题 ...
- vue3 最长递增子序列 diff优化
//vue3优化版(回头我会完善下算法思路) function getSequence(arr) { const p = arr.slice() const result = [0] let i, j ...
- android怎么做表格显示数据
实现思路:最底层(父级)背景为黑色,最上层(子级)背景为白色,然后父子组件之间存在一丝间隔即可显示出类似边框的线. 本次主要利用Android中的TableRow等实现,其他类比也可以实现效果. &l ...
- js对于客户端的区分代码
//区分设备 function judge_decice() { let ua =navigator.userAgent.toLowerCase(); if(/android|adr/gi.test( ...
- 利用ICMP协议的PING命令获取客户端当前网络质量 by徐文棋
无论在windows下,linux也好,unix也好,都可以通过 Ping命令获得当前设备的网络延迟,延迟是客户端到服务端的网络响应时间.通常延迟越低,反应速度越快 这里使用了SimplePing ...
- Git修改提交历史中的作者及邮箱信息
一.使用rebase 如图,红圈中提交的用户名及邮箱是需要改的,则需要复制需要改的提交记录的上一个记录hashcode,在本例中就是a0a891a48f92b51201042fccbe61ed1264 ...
- Azure AD Domain Service(二)为域服务中的机器配置 Azure File Share 磁盘共享
一,引言 Azure File Share 是支持两种认证方式的! 1)Active Directory 2)Storage account key 记得上次分析的 "Azure File ...
- 从零开始实现一个分布式RPC框架
该rpc框架是一个mini版的dubbo.学习rpc之前,建议先了解NIO,Netty和Dubbo等知识.请移步网络编程 前言:(借用阿里大佬的一段话) 为什么要自己写一个RPC框架,我觉得从个人成长 ...