翼度科技»论坛 编程开发 .net 查看内容

CommunityToolkit.Mvvm8.1 viewmodel源生成器写法(3)

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
 
本系列文章导航

希望提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:https://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

定义vm时,请使用分部类,并且继承ObservableObject
  1. public partial class DataViewModel2 : ObservableObject
  2. {
  3. }
复制代码
 
ObservableProperty标记属性

定义属性如此简单:一个[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通知依赖属性

[NotifyPropertyChangedFor( nameof( Caption ) )]标识:在LastName改变后,去通知Caption
  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通知依赖命令

在属性IsEnabled改变后,通知命令:ButtonClickCommand
  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. //}
复制代码
 
 
命令

RelayCommand标识定义一个命令,如此简单
  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. //}
复制代码
 
 
异步命令

把方法标识为async,即可定义为异步命令,它带有一个IsRunning属性,可以在view中做进度条判断
  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. [/code] 
  2. [size=6]某个属性改变[/size]
  3. On+属性Changing  On+属性Changed,可以记录某个属性值变化事件
  4. [code]/*
  5. 还可以实现2个方法:OnLastNameChanging OnLastNameChanged (注意2个方法只可以实现其中一个,或者都不实现(不能同时2个))
  6. */
  7. //partial void OnLastNameChanging ( string value )
  8. //{
  9. //    Debug.WriteLine( value );
  10. //}
  11. partial void OnLastNameChanged ( string value )
  12. {
  13.     // 可以做一些其它事情 例如:属性改变后,消息通知某某某
  14.     Debug.WriteLine( value );
  15.     //说明:如果上面[NotifyPropertyChangedFor( nameof( Caption ) )]不写,可以这里手动通知属性更新
  16.     //OnPropertyChanged( nameof( Caption ) );
  17. }
复制代码
 
所有属性改变

所有属性改变后都会调用这个事件,参数PropertyName可以区分具体哪个属性
  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. }
复制代码
 
完整代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using CommunityToolkit.Mvvm.ComponentModel;
  9. using CommunityToolkit.Mvvm.Input;
  10. /*
  11. 这里演示自动生成属性和命令
  12. 1.继承ObservableObject 并且类标记是分部类partial
  13. 2.私有变量标记属性 [ObservableProperty]
  14. 3.NotifyCanExecuteChangedFor  通知依赖命令
  15.   NotifyPropertyChangedFor    通知依赖属性
  16. 4.RelayCommand  定义命令
  17. 5.OnPropertyChanged 手动通知属性更新
  18. 6.ButtonClickCommand.NotifyCanExecuteChanged() 手动通知命令更新
  19. 7.OnLastNameChanging OnLastNameChanged  某个属性改变
  20. 8.OnPropertyChanged  所有属性改变
  21. */
  22. namespace WpfDemoNet6.Demo
  23. {
  24.     public partial class DataViewModel2 : ObservableObject
  25.     {
  26.         /*
  27.         [ObservableProperty]标记后,会自动生成属性(大写命名),例如:下面会自动生成Title
  28.         注意:这个私有变量命名:必须是小写开头,或者下划线,或者m_
  29.         */
  30.         /*
  31.         NotifyPropertyChangedFor 通知依赖属性Caption
  32.         */
  33.         [ObservableProperty]
  34.         [NotifyPropertyChangedFor( nameof( Caption ) )]
  35.         private string title = "hello";
  36.         //public string Title
  37.         //{
  38.         //    get
  39.         //    {
  40.         //        return title;
  41.         //    }
  42.         //    set
  43.         //    {
  44.         //        //title = value;
  45.         //        //PropertyChanged?.Invoke( this , new PropertyChangedEventArgs( "Name" ) );
  46.         //        //SetProperty 相当与设置值,并且PropertyChanged通知调用
  47.         //        SetProperty( ref title , value );
  48.         //    }
  49.         //}
  50.         /*
  51.                 [NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]
  52.         NotifyCanExecuteChangedFor是通知依赖命令(触发命令),相当于set中ButtonClickCommand.NotifyCanExecuteChanged();
  53.         */
  54.         [ObservableProperty]
  55.         [NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]
  56.         private bool isEnabled = false;
  57.         //public bool IsEnabled
  58.         //{
  59.         //    get => isEnabled;
  60.         //    set
  61.         //    {
  62.         //        SetProperty( ref isEnabled , value );
  63.         //        //通知命令 已经改变
  64.         //        ButtonClickCommand.NotifyCanExecuteChanged();
  65.         //    }
  66.         //}
  67.         //partial void OnIsEnabledChanged ( bool value )
  68.         //{
  69.         //     //如果上面的[NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]不写,可以这里手动通知更新
  70.         //    //ButtonClickCommand.NotifyCanExecuteChanged();
  71.         //}
  72.         /*
  73.         RelayCommand是定义命令,自动生成的命令名是方法名+Command,并且初始化
  74.         例如:下面的会自动生成ButtonClickCommand
  75.         CanExecute是指定一个判断方法,判断是否可用
  76.         */
  77.         [RelayCommand( CanExecute = nameof( CanButton ) )]
  78.         void ButtonClick ()
  79.         {
  80.             //点击按钮,修改标题
  81.             Title = "hello(改)";
  82.         }
  83.         bool CanButton ()
  84.         {
  85.             return IsEnabled;
  86.         }
  87.         //public RelayCommand ButtonClickCommand
  88.         //{
  89.         //    get;
  90.         //}
  91.         public DataViewModel2 ()
  92.         {
  93.             //RelayCommand的第一个参数是命令调用语句
  94.             //              第2个参数(可选)是否允许使用
  95.             //ButtonClickCommand = new RelayCommand( () =>
  96.             //{
  97.             //    //点击按钮,修改标题
  98.             //    Title = "hello(改)";
  99.             //} , () =>
  100.             //{
  101.             //    return IsEnabled;
  102.             //} );
  103.             //ButtonClickParCommand = new RelayCommand<double>( ( double val ) =>
  104.             //{
  105.             //    Title = $"hello(改):{val}";
  106.             //} );
  107.         }
  108.         [RelayCommand]
  109.         void ButtonClickPar ( double val )
  110.         {
  111.             Title = $"hello(改):{val}";
  112.         }
  113.         //public RelayCommand<double> ButtonClickParCommand
  114.         //{
  115.         //    get;
  116.         //}
  117.         public string Caption
  118.         {
  119.             get
  120.             {
  121.                 return string.Format( "Title:{0}-{1}" , Title , LastName );
  122.             }
  123.         }
  124.         [ObservableProperty]
  125.         [NotifyPropertyChangedFor( nameof( Caption ) )]
  126.         private string lastName = "abc";
  127.         /*
  128.         还可以实现2个方法:OnLastNameChanging OnLastNameChanged (注意2个方法只可以实现其中一个,或者都不实现(不能同时2个))
  129.         */
  130.         //partial void OnLastNameChanging ( string value )
  131.         //{
  132.         //    Debug.WriteLine( value );
  133.         //}
  134.         partial void OnLastNameChanged ( string value )
  135.         {
  136.             // 可以做一些其它事情 例如:属性改变后,消息通知某某某
  137.             Debug.WriteLine( value );
  138.             //说明:如果上面[NotifyPropertyChangedFor( nameof( Caption ) )]不写,可以这里手动通知属性更新
  139.             //OnPropertyChanged( nameof( Caption ) );
  140.         }
  141.         /// <summary>
  142.         /// 所有属性改变
  143.         /// </summary>
  144.         /// <param name="e"></param>
  145.         protected override void OnPropertyChanged ( PropertyChangedEventArgs e )
  146.         {
  147.             base.OnPropertyChanged( e );
  148.             // 可以获取到是哪个属性改变了
  149.             var _proname = e.PropertyName;
  150.         }
  151.     }
  152. }
复制代码
 
导航https://github.com/aierong/WpfDemo/tree/main/WpfDemoNet6 (项目地址)
https://github.com/aierong/WpfDemo/blob/main/WpfDemoNet6/Demo/DataViewModel2.cs (代码地址)
 
A.Sql Server2005 Transact-SQL 新兵器学习
B.MCAD学习
C.代码阅读总结
D.ASP.NET状态管理
E.DB(数据库)
F.WAP
G.WinForm
H.Flex

希望上面提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:http://www.cnblogs.com/aierong
贴子以"现状"提供且没有任何担保,同时也没有授予任何权利!
本文版权归作者所有,欢迎转载!
原创技术文章和心得,转载注明出处!这也是对原创者的尊重!


来源:https://www.cnblogs.com/aierong/archive/2023/04/11/17305990.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具