本系列文章导航

  1. https://www.cnblogs.com/aierong/category/2297596.html

0.说明

CommunityToolkit.Mvvm8.1有一个重大更新的功能:源生成器功能,它极大简化我们的mvvm代码

但是本篇先总结一下原写法,下篇再总结源生成器功能

1.模型定义

必须继承:ObservableObject

2.viewmodel代码实现

几个关键点:

SetProperty是给属性赋值,并且通知更改通知
ButtonClickCommand.NotifyCanExecuteChanged(); //通知命令 已经改变
RelayCommand ButtonClickCommand //定义命令

namespace WpfDemoNet6.Demo
{
public class DataViewModel1 : ObservableObject
{
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 );
}
} private bool isEnabled = false; /// <summary>
/// 是否可以使用
/// </summary>
public bool IsEnabled
{
get => isEnabled;
set
{
SetProperty( ref isEnabled , value ); //通知命令 已经改变
ButtonClickCommand.NotifyCanExecuteChanged();
}
} /// <summary>
/// 命令
/// </summary>
public RelayCommand ButtonClickCommand
{
get;
} public DataViewModel1 ()
{
//RelayCommand的第一个参数是命令调用语句
// 第2个参数(可选)是否允许使用
ButtonClickCommand = new RelayCommand( () =>
{
//点击按钮,修改标题
Title = "hello(改)";
} , () =>
{
return IsEnabled;
} ); ButtonClickCommandPar = new RelayCommand<double>( ( double val ) =>
{
Title = $"hello(改):{val}";
} );
} public RelayCommand<double> ButtonClickCommandPar
{
get;
}
}
}

3.异步命令

异步命令会自动控制控件的可见性,并且提供一个IsRunning属性可以判断异步是否完成

public DataViewModel1 ()
{
AsyncButtonClickCommand = new AsyncRelayCommand( RunTxtAsync );
AsyncButtonParClickCommand = new AsyncRelayCommand<double>( RunTxtParAsync );
} /*
特别说明:异步命令会自动控制控件的可见性,并且提供一个IsRunning属性可以判断异步是否完成
*/ /// <summary>
/// 命令
/// </summary>
public IAsyncRelayCommand AsyncButtonClickCommand
{
get;
} private async Task RunTxtAsync ()
{
await Task.Delay( 4800 );
Title = "hello(Task改)";
} /// <summary>
/// 命令(带参数的)
/// </summary>
public IAsyncRelayCommand<double> AsyncButtonParClickCommand
{
get;
} private async Task RunTxtParAsync ( 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}}" />

CommunityToolkit.Mvvm8.1 viewmodel使用-旧式写法(2)的更多相关文章

  1. 《精通Matlab神经网络》例10-16的新写法

    <精通Matlab神经网络>书中示例10-16,在创建BP网络时,原来的写法是: net = newff(minmax(alphabet),[S1 S2],{'logsig' 'logsi ...

  2. Shell入门教程:命令替换 $() 和 ``

    所谓命令替换,是把命令执行后的标准输出放入变量中.这是一个十分有威力的功能.例如说, 想查看工作目录中所有的文件名,可执行ls命令,但如何把这些文件名存入变量中,供往后的程序代码再利用呢? 使用命令替 ...

  3. c++异常总结

    堆栈辗转开解(stack-unwinding):如果一个函数中出现异常,在当前函数内即通过 try..catch 捕捉(且捕捉到)的话,可以继续往下执行:如果不捕捉(或未捕捉到)就会抛出(与通过 th ...

  4. Matlab神经网络函数newff()新旧用法差异

    摘要 在Matlab R2010a版中,如果要创建一个具有两个隐含层.且神经元数分别为5.3的前向BP网络,使用旧的语法可以这样写: net1 = newff(minmax(P), [5 3 1]); ...

  5. C/C+小记

    1.struct与typedef struct struct Student{int a;int b}stu1; //定义名为Student的结构体,及一个Student变量stu1 struct { ...

  6. php示例的错误记录

    最近几天在测试php的mvc,从网上找到几个示例. 先学习这一篇,http://www.cnblogs.com/q1ng/p/4529496.html 标题是  PHP的MVC框架 深入解析,其实是最 ...

  7. Selenium WebDriver Api 知识梳理

    之前一直没有系统的梳理WebDriver Api的相关知识,今天借此机会整理一下. 1.页面元素定位 1.1.8种常用定位方法 # id定位 driver.find_element_by_id() # ...

  8. ElasticSearch 2 (22) - 语言处理系列之标记规范化

    ElasticSearch 2 (22) - 语言处理系列之标记规范化 摘要 将文本拆解成标记只是工作的一半.为了使这些标记更容易被搜索到,它们需要经过一个规范化的处理过程,以移除相同单词间不重要的差 ...

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

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

  10. sql 一些题目

    这道SQL笔试题你会怎么写(转) 最近面试了一些Senior BI的候选人,行业经验三年到七年不等,起初觉得这个Level的无需准备笔试题,碍于领导执念,就在真实项目中提取5道SQL题目,这里仅单说其 ...

随机推荐

  1. 什么是Vuex

    Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享. 优点: 能够在Vuex中集中管理共享的数居,易于开发和后期维护 能够高效地实现组件之间的数据共享,提高开发效率 存 ...

  2. ffmpeg安装教程

    1 下载所需要的软件 mkdir /usr/local/soft cd /usr/local/soft wget https://www.ffmpeg.org/releases/ffmpeg-snap ...

  3. layui中文离线文档PDF下载

    失效链接处理 layui中文离线文档 PDF 下载 本站整理下载: 链接:https://pan.baidu.com/s/18FbllhLEezXTn-y1eiiNKg  提取码:nuqz      ...

  4. JAVA面经-基础篇-线程

    1.创建线程有哪几种方式?   创建线程有3种方式,分别是继承Thread类.实现Runnable类.实现Callable类.   继承Thread类的步骤:     1. 定义Thread类的子类, ...

  5. Java定时器Timer和TimerTask

    方式一:设定指定任务task在指定时间time执行 schedule(TimerTask task, Date date)   public static void main(String[] arg ...

  6. 8.Vuex状态管理

    一.Vuex 概述 1.1 组件之间共享数据的方式 父传子: v-bind 属性绑定 子传父: v-on 事件绑定 兄弟组件之间共享数据: EventBus $on 接收数据的那个组件 (数据接收方) ...

  7. DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC SHRINKDATABASE收缩指定数据库中的数据文件和日志文件的大小

    收缩指定数据库中的数据文件和日志文件的大小.  Transact-SQL 语法约定 语法 DBCC SHRINKDATABASE ( database_name | database_id | 0 [ ...

  8. Spring 常见问题 - 2

    1. @Component, @Controller, @Repository, @Service 有何区别? @Component:这将 java 类标记为 bean.它是任何 Spring 管理组 ...

  9. 在服务器建立git服务端接收push后覆盖部署记录

    1.在本地要部署的目录 git initgit clone --bare ./ my_project.git 把本地init仓库克隆到 my_project.git 2.上传my_project.gi ...

  10. msfconsole的使用

    msfconsole是metasploit中的一个工具: msfconsole集成了很多漏洞的利用的脚本,并且使用起来很简单的网络安全工具 在终端输入msfconsole命令即可进入msf的控制台,m ...