轻量级MVVM框架 Stylet

匿名 (未验证) 提交于 2019-12-02 22:10:10

这两天试了下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>

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去显示。

先写到这!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!