当前位置: 首页 > news >正文

WPF CommunityToolkit.Mvvm

文章目录

  • 前言
  • Toolkit
    • Nuget安装
    • 简单使用
      • SetProperty,通知更新
      • RealyCommand
        • CanExecute
    • 新功能,代码生成器
      • ObservableProperty
      • NotifyCanExecuteChangedFor
      • RelayCommand
        • 其他功能
        • 对应关系
      • NotifyPropertyChangedFor

前言

CommunityToolkit.Mvvm(以下简称Toolkit)是WPF最有名的两个框架,一个是Prism,另一个就是Toolkit。

Prism可以看我的Prism详解

WPF Prims框架详解

Toolkit

Toolkit 官方文档

用 CommunityToolkit.Mvvm 加速 MVVM 开发流程

Nuget安装

在这里插入图片描述

简单使用

Toolkit简单复写了我们常用的两个方法
一个是 SetProperty,一个是RelayCommand

SetProperty,通知更新

 public class MainViewModel:ObservableObject{private string _title;public string Title{get => _title;set => SetProperty(ref _title,value);}}

RealyCommand

public RelayCommand ButtonClickCommand { get; set; }public MainViewModel()
{ButtonClickCommand = new RelayCommand(() => { Debug.WriteLine("Hello World!"); });}

MVVM模式的3种command总结[2]–RelayCommand

RealyCommand主要有一个CanExecute属性。通知是否能点击

CanExecute

通知按钮能否点击(我感觉有点鸡肋)

public class MainViewModel:ObservableObject
{private string _title = "Hello world!";public string Title{get => _title;set => SetProperty(ref _title,value);}private bool _isEnable = false;public bool IsEnable{get=> _isEnable;set{SetProperty(ref _isEnable,value);ButtonClickCommand.NotifyCanExecuteChanged();}}public RelayCommand ButtonClickCommand { get; set; }public MainViewModel(){ButtonClickCommand = new RelayCommand(() => { Title = "Value is changed"; },()=>IsEnable);}
}
<Window.DataContext><viewModel:MainViewModel />
</Window.DataContext>
<Grid><StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" ><TextBox Text="{Binding Title}" Width="200"/><CheckBox Content="Is Enable" IsChecked="{Binding IsEnable}" /><Separator Margin="5"/><Button Command="{Binding ButtonClickCommand}" Content="Click Me"/></StackPanel>
</Grid>

在这里插入图片描述

新功能,代码生成器

Toolkit新增了生成器功能,自动帮我们将代码补全。

ObservableProperty

ObservableProperty
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
生成的Public属性是符合一下特性

  • private
    • name=>Name
    • _name=>Name
    • m_name=>Name

以上三者都会自动对应到public Name

NotifyCanExecuteChangedFor

因为我们之前修改RelayCommand的CanExecute都是通过public 里面的get set去通知的,我们现在可以使用NotifyCanExecuteChangedFor来通知

[NotifyCanExecuteChangedFor(nameof(ButtonClickCommand))]
[ObservableProperty]
private bool _isEnable = false;
//等价于
private bool _isEnable = false;public bool IsEnable{get=> _isEnable;set{SetProperty(ref _isEnable,value);ButtonClickCommand.NotifyCanExecuteChanged();}}

RelayCommand

RelayCommand给一个Void函数,会自动生成一个对应Command 和初始化这个Command

[RelayCommand]
public void ButtonClick()
{}
//等价于
public RelayCommand ButtonClickCommand { get; set; }public MainViewModel()
{ButtonClickCommand = new RelayCommand(() => { Title = "Value is changed"; }, () => IsEnable);}

其他功能

//将CanExecute绑定到IsEnable
[RelayCommand(CanExecute =nameof(IsEnable))]
public void ButtonClick()
{}
///异步函数也可以,CanExecute会在异步函数结束之后变回去
[RelayCommand(CanExecute =nameof(IsEnable))]
public async Task ButtonClickAsync()
{await Task.Delay(1000);Title = "我被修改了";
}

异步函数演示:注意看按钮颜色
在这里插入图片描述

对应关系

ButtonClickAsync、ButtonClick=>ButtonClickCommand

NotifyPropertyChangedFor

我们希望两个属性是强关联的,比如Title和TestStr是强关联的。

我们希望能通知另一个属性发生了更改,比如Title 通知TestStr更改

 private string testStr = $"Title:{Title}";

但是这么写会报错,只能设置静态方法
在这里插入图片描述
然后我们可以通过NotifyPropertyChangedFor来进行通知

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(TestStr))]
private string _title = "Hello world!";public string TestStr => $"Title:{Title}";
http://www.lryc.cn/news/134249.html

相关文章:

  • Vue开发中如何解决国际化语言切换问题
  • 基于springboot+vue的流动人口登记系统(前后端分离)
  • Stable Diffusion的使用以及各种资源
  • Redis 分布式锁的实现方式
  • VMware上搭建的虚拟机突然本地无法连接服务器
  • JDBC回顾
  • mq 消息队列 mqtt emqx ActiveMQ RabbitMQ RocketMQ
  • 沃尔玛卖家必看!解决订单被Kan、Feng号问题的终极方案!
  • 浅谈日常使用的 Docker 底层原理-三大底座
  • 前端面试:【DOM】编织网页的魔法
  • 基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 2 Inport和Outports 标签页介绍
  • 第9步---MySQL的索引和存储引擎
  • Numpy入门(3)—线性代数
  • php的openssl_encrypt是不是自动做了PKCS5Padding?
  • 在本地创建repository及上传至github
  • 情人节特别定制:多种语言编写动态爱心网页(附完整代码)
  • Docker mysql主从同步安装
  • docker update 命令
  • 阻塞和挂起的区别和联系
  • 水力发电厂测量装置配置选型及厂用电管理系统
  • 【RabbitMQ】RabbitMQ整合SpringBoot案例
  • 如何在window下cmd窗口执行linux指令?
  • c++基础系列:字符串、向量和数组
  • docker 05(dockerfile)
  • PostMan 测试项目是否支持跨域
  • jsp 协同过滤 图书管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 商城-学习整理-高级-商城业务-商品上架es(十)
  • 【水文学法总结】河道内生态流量计算方法(含MATLAB实现代码)
  • 特斯拉Model 3的七年狂飙
  • 物流签收异常,财务对账复杂,怎么解决?