本系列文章导航

  1. https://www.cnblogs.com/aierong/p/17300066.html
  2. https://github.com/aierong/WpfDemo (自我Demo地址)

希望提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:http://www.cnblogs.com/aierong

说明

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

  1. public partial class DataViewModel2 : ObservableObject
  2. {
  3. }

ObservableProperty标记属性

  1. /*
  2. [ObservableProperty]标记后,会自动生成属性(大写命名),例如:下面会自动生成Title
  3. 注意:这个私有变量命名:必须是小写开头,或者下划线,或者m_
  4. */
  5. [ObservableProperty]
  6. private string title = "hello";
  7. //public string Title
  8. //{
  9. // get
  10. // {
  11. // return title;
  12. // }
  13. // set
  14. // {
  15. // //title = value;
  16. // //PropertyChanged?.Invoke( this , new PropertyChangedEventArgs( "Name" ) );
  17. // //SetProperty 相当与设置值,并且PropertyChanged通知调用
  18. // SetProperty( ref title , value );
  19. // }
  20. //}

NotifyPropertyChangedFor通知依赖属性

  1. public string Caption
  2. {
  3. get
  4. {
  5. return string.Format( "Title:{0}-{1}" , Title , LastName );
  6. }
  7. }
  8. [ObservableProperty]
  9. [NotifyPropertyChangedFor( nameof( Caption ) )]
  10. private string lastName = "abc";

NotifyCanExecuteChangedFor通知依赖命令

  1. /*
  2. [NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]
  3. NotifyCanExecuteChangedFor是通知依赖命令(触发命令),相当于set中ButtonClickCommand.NotifyCanExecuteChanged();
  4. */
  5. [ObservableProperty]
  6. [NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]
  7. private bool isEnabled = false;
  8. //public bool IsEnabled
  9. //{
  10. // get => isEnabled;
  11. // set
  12. // {
  13. // SetProperty( ref isEnabled , value );
  14. // //通知命令 已经改变
  15. // ButtonClickCommand.NotifyCanExecuteChanged();
  16. // }
  17. //}
  18. //partial void OnIsEnabledChanged ( bool value )
  19. //{
  20. // //如果上面的[NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]不写,可以这里手动通知更新
  21. // //ButtonClickCommand.NotifyCanExecuteChanged();
  22. //}

命令

  1. /*
  2. RelayCommand是定义命令,自动生成的命令名是方法名+Command,并且初始化
  3. 例如:下面的会自动生成ButtonClickCommand
  4. CanExecute是指定一个判断方法,判断是否可用
  5. */
  6. [RelayCommand( CanExecute = nameof( CanButton ) )]
  7. void ButtonClick ()
  8. {
  9. //点击按钮,修改标题
  10. Title = "hello(改)";
  11. }
  12. bool CanButton ()
  13. {
  14. return IsEnabled;
  15. }
  16. //public RelayCommand ButtonClickCommand
  17. //{
  18. // get;
  19. //}
  20. [RelayCommand]
  21. void ButtonClickPar ( double val )
  22. {
  23. Title = $"hello(改):{val}";
  24. }
  25. //public RelayCommand<double> ButtonClickParCommand
  26. //{
  27. // get;
  28. //}

异步命令

  1. [RelayCommand]
  2. async Task AsyncButtonClick ()
  3. {
  4. await Task.Delay( 4800 );
  5. Title = "hello(Task改)";
  6. }
  7. [RelayCommand]
  8. async Task AsyncButtonParClick ( double val )
  9. {
  10. await Task.Delay( 4800 );
  11. Title = $"hello(Task改):{val}";
  12. }
  1. <!--
  2. 特别说明:异步命令会自动控制控件的可见性,并且提供一个IsRunning属性可以判断异步是否完成
  3. -->
  4. <Button Width="100"
  5. Height="30"
  6. Command="{Binding AsyncButtonClickCommand}"
  7. Content="异步" />
  8. <TextBlock HorizontalAlignment="Center"
  9. FontSize="20"
  10. FontStyle="Italic"
  11. FontWeight="Bold"
  12. Foreground="Green"
  13. Text="loading......"
  14. Visibility="{Binding AsyncButtonClickCommand.IsRunning, Converter={StaticResource myboolconvert}}" />

某个属性改变

  1. /*
  2. 还可以实现2个方法:OnLastNameChanging OnLastNameChanged (注意2个方法只可以实现其中一个,或者都不实现(不能同时2个))
  3. */
  4. //partial void OnLastNameChanging ( string value )
  5. //{
  6. // Debug.WriteLine( value );
  7. //}
  8. partial void OnLastNameChanged ( string value )
  9. {
  10. // 可以做一些其它事情 例如:属性改变后,消息通知某某某
  11. Debug.WriteLine( value );
  12. //说明:如果上面[NotifyPropertyChangedFor( nameof( Caption ) )]不写,可以这里手动通知属性更新
  13. //OnPropertyChanged( nameof( Caption ) );
  14. }

所有属性改变

  1. /// <summary>
  2. /// 所有属性改变
  3. /// </summary>
  4. /// <param name="e"></param>
  5. protected override void OnPropertyChanged ( PropertyChangedEventArgs e )
  6. {
  7. base.OnPropertyChanged( e );
  8. // 可以获取到是哪个属性改变了
  9. var _proname = e.PropertyName;
  10. }

导航

https://github.com/aierong/WpfDemo/tree/main/WpfDemoNet6 (项目地址)

https://github.com/aierong/WpfDemo/blob/main/WpfDemoNet6/Demo/DataViewModel2.cs (代码地址)

CommunityToolkit.Mvvm8.1 viewmodel源生成器写法(3)的更多相关文章

  1. C#预处理器指令 ,你造吗??? (●'◡'●)

    什么是c#预处理指令?? 用于在 C# 源代码中嵌入的编译器命令. C#预处理器指令有哪些?? ↓↓↓这些就是预处理器指令啦 下面我们一一道来(●'◡'●) 1.#if ,#elif,#else,en ...

  2. centos6.6 安装MariaDB

    参考文章:yum安装MariaDB(使用国内镜像快速安装,三分钟安装完毕) 安装环境: virtualbox下CentOS6.6(32位) 遇到的问题: 通过Maria官方提供的安装方式,源是国外的源 ...

  3. debian之apt源

    美国的 deb http://ftp.us.debian.org/debian stable main contrib non-freedeb-src http://ftp.us.debian.org ...

  4. 一个简单的knockout.js 和easyui的绑定

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Basi ...

  5. Oracle 高性能SQL引擎剖析----执行计划

    执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行 ...

  6. Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder

    1.数组线性表ArrayList 数组一旦定义则不可改变大小.ArrayList可以不限定个数的存储对象.添加,插入,删除,查找比较数组更加容易.可以直接使用引用类型变量名输出,相当于toString ...

  7. F#周报2019年第50期

    新闻 Azure Functions 3.0系统上线 GC性能架构--第1部分 ConfigureAwait问题解答 介绍System.Threading.Channels Windows Serve ...

  8. Docs-.NET-C#-指南-语言参考-预处理器指令:#line(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#line(C# 参考) 1.返回顶部 1. #line(C# 参考) 2015/07/20 借助 #line,可修改编译器的行 ...

  9. SQL在Oracle内部的具体处理流程

         下图显示了SQL在Oracle内部处理的一般阶段:解析.优化.产生行源和执行.数据库可能会忽略某些步骤,这取决于具体的语句.                                 ...

  10. NuGet-Doc:承载自己的 NuGet 源

    ylbtech-NuGet-Doc:承载自己的 NuGet 源 1.返回顶部 1. 可能希望将包仅发布到有限受众(例如,组织或工作组),而不是将其公开发布. 此外,一些公司可能希望限制其开发人员可以使 ...

随机推荐

  1. linux 离线安装mysql 配置开机自启动

    系统版本:centos7.8 | mysql版本:5.7.35 安装配置mysql数据库 mysql数据库配置开机自启动 1. 安装配置mysql数据库 mysql版本:5.7.35 点击下载 提取码 ...

  2. CF 1272 D. Remove One Element

    D. Remove One Element time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  3. Tutorial_WorkflowProcessor usage in AX 2012

    Check under system administration if the BC proxy and workflow excecution account are still valid. C ...

  4. win10自带录屏为什么录两个小时自动关闭?如何调节使其可以时间更长?

    Windows设置->游戏->屏幕截图->录制时间: https://www.zhihu.com/question/404390297

  5. GO语言http请求方法,可以携带请求头Header与cookie

    1.目录 2.main.go package main import "fmt" import "demo/common/http" func main() { ...

  6. 从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制

    引子  在使用Fortify扫描时代码报XML External Entity Injection,此漏洞为xml实体注入漏洞,XXE攻击可利用在处理时动态构建文档的 XML 功能.修复方案也包含了增 ...

  7. C#中字符数组,字节数组和string之间的转化(转)

    原文链接:http://hi.baidu.com/endyli/item/7bf074945de35e1f934f41fe 来源: NDC(NetworkDiskClient)的界面和后台程序之间用S ...

  8. LP两阶段法(一阶段)

    \begin{equation}\begin{aligned}\min \quad & z=\mathbf{c}^{T} \mathbf{x} \\\text { s.t. } & \ ...

  9. OSPF与ISIS比较

  10. 虚拟环境 venv的使用--(venv 一)

    一.引言最近在学习<Flask Web Development 2nd Edition>的时候,作者开篇就介绍如何使用 venv 来管理 Python 环境 .自我觉得作者讲的非常好,想要 ...