这两天试了下Stylet框架,这个框架虽然很小,可是功能齐全,简化了不少MVVM的代码,好比Command,对Dialog,MessageBox都有很好的支持。html
开源地址 https://github.com/canton7/Styletgit
新建一个WPF项目,添加NuGet引用github
安装完成后会自动添加一个BootStrapper文件,这个文件是项目启动文件express
public class Bootstrapper : Bootstrapper<ShellViewModel>
BootStrapper<ShellViewModel>,这个是对应的启动窗体,Stylet是根据ViewModel去找对应的View去显示,ViewModel与View的名称要一致。app
咱们新添加一个窗体,界面上放一个文本和三个按钮,来体验下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,添加对应的属性和方法spa
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绑定的是方法而不是命令对象3d
Stylet也能够像Command同样作CanCommandExecute的功能。code
好比,文本框的Text为空,则不能够点按钮orm
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去显示。
先写到这!