CommunityToolkit.Mvvm8.1 viewmodel源生成器写法(3)
本系列文章导航
说明
CommunityToolkit.Mvvm8.1最令人惊喜的是它提供的源生成器功能,它极大简化我们的mvvm代码
我们通过标记一个属性就可以实现某个功能,这个很方便快捷,推荐
常用标记总结
1.继承ObservableObject 并且类标记是分部类partial
2.私有变量标记属性 [ObservableProperty]
3.NotifyCanExecuteChangedFor 通知依赖命令
NotifyPropertyChangedFor 通知依赖属性
4.RelayCommand 定义命令
5.OnPropertyChanged 手动通知属性更新
6.ButtonClickCommand.NotifyCanExecuteChanged() 手动通知命令更新
7.OnLastNameChanging OnLastNameChanged 某个属性改变
8.OnPropertyChanged 所有属性改变
定义viewmodel
public partial class DataViewModel2 : ObservableObject
{
}
ObservableProperty标记属性
/*
[ObservableProperty]标记后,会自动生成属性(大写命名),例如:下面会自动生成Title
注意:这个私有变量命名:必须是小写开头,或者下划线,或者m_
*/
[ObservableProperty]
private string title = "hello";
//public string Title
//{
// get
// {
// return title;
// }
// set
// {
// //title = value;
// //PropertyChanged?.Invoke( this , new PropertyChangedEventArgs( "Name" ) );
// //SetProperty 相当与设置值,并且PropertyChanged通知调用
// SetProperty( ref title , value );
// }
//}
NotifyPropertyChangedFor通知依赖属性
public string Caption
{
get
{
return string.Format( "Title:{0}-{1}" , Title , LastName );
}
}
[ObservableProperty]
[NotifyPropertyChangedFor( nameof( Caption ) )]
private string lastName = "abc";
NotifyCanExecuteChangedFor通知依赖命令
/*
[NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]
NotifyCanExecuteChangedFor是通知依赖命令(触发命令),相当于set中ButtonClickCommand.NotifyCanExecuteChanged();
*/
[ObservableProperty]
[NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]
private bool isEnabled = false;
//public bool IsEnabled
//{
// get => isEnabled;
// set
// {
// SetProperty( ref isEnabled , value );
// //通知命令 已经改变
// ButtonClickCommand.NotifyCanExecuteChanged();
// }
//}
//partial void OnIsEnabledChanged ( bool value )
//{
// //如果上面的[NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]不写,可以这里手动通知更新
// //ButtonClickCommand.NotifyCanExecuteChanged();
//}
命令
/*
RelayCommand是定义命令,自动生成的命令名是方法名+Command,并且初始化
例如:下面的会自动生成ButtonClickCommand
CanExecute是指定一个判断方法,判断是否可用
*/
[RelayCommand( CanExecute = nameof( CanButton ) )]
void ButtonClick ()
{
//点击按钮,修改标题
Title = "hello(改)";
}
bool CanButton ()
{
return IsEnabled;
}
//public RelayCommand ButtonClickCommand
//{
// get;
//}
[RelayCommand]
void ButtonClickPar ( double val )
{
Title = $"hello(改):{val}";
}
//public RelayCommand<double> ButtonClickParCommand
//{
// get;
//}
异步命令
[RelayCommand]
async Task AsyncButtonClick ()
{
await Task.Delay( 4800 );
Title = "hello(Task改)";
}
[RelayCommand]
async Task AsyncButtonParClick ( double val )
{
await Task.Delay( 4800 );
Title = $"hello(Task改):{val}";
}
<!--
特别说明:异步命令会自动控制控件的可见性,并且提供一个IsRunning属性可以判断异步是否完成
-->
<Button Width="100"
Height="30"
Command="{Binding AsyncButtonClickCommand}"
Content="异步" />
<TextBlock HorizontalAlignment="Center"
FontSize="20"
FontStyle="Italic"
FontWeight="Bold"
Foreground="Green"
Text="loading......"
Visibility="{Binding AsyncButtonClickCommand.IsRunning, Converter={StaticResource myboolconvert}}" />
某个属性改变
/*
还可以实现2个方法:OnLastNameChanging OnLastNameChanged (注意2个方法只可以实现其中一个,或者都不实现(不能同时2个))
*/
//partial void OnLastNameChanging ( string value )
//{
// Debug.WriteLine( value );
//}
partial void OnLastNameChanged ( string value )
{
// 可以做一些其它事情 例如:属性改变后,消息通知某某某
Debug.WriteLine( value );
//说明:如果上面[NotifyPropertyChangedFor( nameof( Caption ) )]不写,可以这里手动通知属性更新
//OnPropertyChanged( nameof( Caption ) );
}
所有属性改变
/// <summary>
/// 所有属性改变
/// </summary>
/// <param name="e"></param>
protected override void OnPropertyChanged ( PropertyChangedEventArgs e )
{
base.OnPropertyChanged( e );
// 可以获取到是哪个属性改变了
var _proname = e.PropertyName;
}
导航
https://github.com/aierong/WpfDemo/tree/main/WpfDemoNet6 (项目地址)
https://github.com/aierong/WpfDemo/blob/main/WpfDemoNet6/Demo/DataViewModel2.cs (代码地址)
CommunityToolkit.Mvvm8.1 viewmodel源生成器写法(3)的更多相关文章
- C#预处理器指令 ,你造吗??? (●'◡'●)
什么是c#预处理指令?? 用于在 C# 源代码中嵌入的编译器命令. C#预处理器指令有哪些?? ↓↓↓这些就是预处理器指令啦 下面我们一一道来(●'◡'●) 1.#if ,#elif,#else,en ...
- centos6.6 安装MariaDB
参考文章:yum安装MariaDB(使用国内镜像快速安装,三分钟安装完毕) 安装环境: virtualbox下CentOS6.6(32位) 遇到的问题: 通过Maria官方提供的安装方式,源是国外的源 ...
- debian之apt源
美国的 deb http://ftp.us.debian.org/debian stable main contrib non-freedeb-src http://ftp.us.debian.org ...
- 一个简单的knockout.js 和easyui的绑定
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Basi ...
- Oracle 高性能SQL引擎剖析----执行计划
执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行 ...
- Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder
1.数组线性表ArrayList 数组一旦定义则不可改变大小.ArrayList可以不限定个数的存储对象.添加,插入,删除,查找比较数组更加容易.可以直接使用引用类型变量名输出,相当于toString ...
- F#周报2019年第50期
新闻 Azure Functions 3.0系统上线 GC性能架构--第1部分 ConfigureAwait问题解答 介绍System.Threading.Channels Windows Serve ...
- Docs-.NET-C#-指南-语言参考-预处理器指令:#line(C# 参考)
ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#line(C# 参考) 1.返回顶部 1. #line(C# 参考) 2015/07/20 借助 #line,可修改编译器的行 ...
- SQL在Oracle内部的具体处理流程
下图显示了SQL在Oracle内部处理的一般阶段:解析.优化.产生行源和执行.数据库可能会忽略某些步骤,这取决于具体的语句. ...
- NuGet-Doc:承载自己的 NuGet 源
ylbtech-NuGet-Doc:承载自己的 NuGet 源 1.返回顶部 1. 可能希望将包仅发布到有限受众(例如,组织或工作组),而不是将其公开发布. 此外,一些公司可能希望限制其开发人员可以使 ...
随机推荐
- mybatis-plus 3.4.3.1 设置数据库字段为NULL
实体字段注解配置 @TableField(jdbcType = JdbcType.VARCHAR, updateStrategy = FieldStrategy.IGNORED) private St ...
- 洛谷 P2330 [SCOI2005]繁忙的都市 题解
START: 2021-08-05 15:30:20 题目链接: https://www.luogu.com.cn/problem/P2330 题目详情: 城市C是一个非常繁忙的大都市,城市中的道路十 ...
- Vue父子组件传值——第一次传不过去之“怪象”?
前言:最近写Vue父子组件传值出现第一次传不过去之"怪象",以为Vue的BUG呢.然则,是自己太菜"^_^"!!!特此记录以警己 <spec-param& ...
- vue使用keepalive缓存上级页面
参考: vue单页应用前进刷新后退不刷新方案探讨 vue,vue-router实现浏览器返回不刷新页面 vue 怎么处理当this.$router.go(-1)时,判断返回指定页面设置指定页面的kee ...
- [C#]Windows窗体应用基础-1
代码参考: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...
- python中and和or表达式的返回值
a or b 首先明确运算顺序, 从左至右 # 其次只要存在真就会返回真, and返回的是最后一个真, or返回的是第一个真 # 再次, a,b中存在假, 则and返回第一个假, or返回最后一个假 ...
- 005Java开发环境搭建
005Java开发环境搭建 1.JDK下载与安装 (1)卸载 首先我们先来学习一下如何卸载JDK. 删除Java的安装目录(jdk整个包). 删除环境变量里的"JAVA_HOME" ...
- Docker 容器的备份和迁移
Docker的Save和Export的区别 Docker的镜像和容器有两种方式导出 Docker Save镜像方法,会保存该镜像的所有历史记录,包括数据 1.创建快照 使用 docker commit ...
- 如何通过dump文件定位崩溃,解决问题
1.dump文件是附加堆栈信息的存储文件的简称,文件扩展名".dmp",通过dump文件我们可以得到程序运行某一时刻的堆栈数据.2.当程序意外崩溃后,通常程序会立即中断运行,拿到这 ...
- Word 给公式添加题注解决交叉引用中包含公式
简记:回车,然后 Ctrl +Alt+Enter https://blog.csdn.net/wsj_jerry521/article/details/115163456