本系列文章导航

  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

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 (代码地址)

最新文章

  1. H3 BPM让天下没有难用的流程之功能介绍
  2. iOS Block循环引用
  3. overflow 属性
  4. mysql更新一个表里的字段等于另一个表某字段的值
  5. Ubuntu系统中登陆阿里云服务器的方法
  6. 好用的log
  7. Quartz(任务调度)- 入门学习
  8. 使用nginx代理kibana并设置身份验证
  9. ThinkPHP中:使用递归写node_merge()函数
  10. junit3对比junit4
  11. android 中List转换String,String转换List 改进版本
  12. 深度解密Go语言之关于 interface 的10个问题
  13. selenium-webdriver循环点击百度搜索结果以及获取新页面的handler
  14. 禁止chrome浏览器的缓冲图片以及css等资源文件
  15. Docker(二十七)-Docker 清理占用的磁盘空间
  16. Django-website 程序案例系列-14 缓存的应用配置文件的写法
  17. 结合CRT与欧拉定理高阶幂求余
  18. java微信小程序解密AES/CBC/PKCS7Padding
  19. 【bzoj3589】动态树
  20. jQuery height() 需要注意的地方

热门文章

  1. C/C++命名规范-C语言基础
  2. Iview Table 图片、超链接
  3. 字符串练习1 于是他错误的点名开始了(Trie)
  4. tensorflow2.0+TF-lite 各种报错
  5. vlan划分和设置
  6. Java笔记第五弹
  7. AC自动机模板题 HDU - 2222
  8. 酷狗的kgma文件,居然包含两个版本
  9. opencv-python 2 图像基本操作
  10. golang pprof监控系列(2) —— memory,block,mutex 使用