首页 > 其他分享 >命令机制

命令机制

时间:2022-08-15 10:48:53浏览次数:32  
标签:RelayCommand DateTime 命令 UI 机制 Now public

RelayCommand有4个成员

// 命令源触发命令后执行
void Execute(object? parameter);
// Execute内部调用会此方法,判断是否真的去执行
bool CanExecute(object? parameter);
// 通知命令源是否被禁用。在ViewModel中调用CanExecuteChanged?.Invoke(this, EventArgs.Empty)可以刷新绑定此命令的元素的启禁用状态;但一般不会调用,而是采用下一个成员void NotifyCanExecuteChanged()刷新命令源的启禁用状态。
// 此事件无需用户注册,WPF的命令机制在UI元素的Command与ViewModel的RelayCommand绑定时自动注册Wpf内部的事件处理程序。
event EventHandler? CanExecuteChanged;
// 通知命令源是否被禁用。是对CanExecuteChanged?.Invoke(this, EventArgs.Empty)的封装,完全等价。
void NotifyCanExecuteChanged();

Execute和CanExecute在UI线程上执行,如有耗时操作,请异步,否则卡UI
RelayCommand的构造方法如下:
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
execute:命令执行的操作
canExecute:命令是否可执行
object是指命令参数,无命令参数时值为null,有参数时,参数委托execute和canExecute若处理,需先进行类型转换后使用。
image

<StackPanel>
    <Button Content="不带参数的命令" Command="{Binding CommandWithoutParam}"  Margin="5" Background="Orange"/>
    <StackPanel Orientation="Horizontal" Margin="5">
        <TextBox MinWidth="100" Name="txt"/>
        <Button Content="带参数的命令" Command="{Binding CommandWithParam}" CommandParameter="{Binding Path=Text, ElementName=txt}" Margin="5 0 0 0" Background="Lime" />
    </StackPanel>
</StackPanel>
public class MainViewModel:ObservableRecipient
{
    /// <summary>
    /// 不带参数的命令
    /// </summary>
    public RelayCommand CommandWithoutParam { get; }
    /// <summary>
    /// 带参数的命令
    /// </summary>
    public RelayCommand CommandWithParam { get; }
    
    public MainViewModel()
    {
        CommandWithoutParam = new RelayCommand((obj) =>
        {
            MessageBox.Show("Hello Mvvm CommandWithoutParams");
        }, (obj) => { return DateTime.Now.Second % 10 == 0 || DateTime.Now.Second % 10 == 1 || DateTime.Now.Second % 10 == 2 || DateTime.Now.Second % 10 == 3 || DateTime.Now.Second % 10 == 4; });

        CommandWithParam = new RelayCommand((obj) =>
        {
            MessageBox.Show("Command Parameter :" + obj.ToString());
        });
    }
}
  • 泛型命令与非泛型命令的区别
  • 无参,单参,多参命令
  • Execute在UI线程执行,所以不可耗时操作
  • CanExecuteChanged在UI线程执行,也不可有耗时操作。
  • 如何通知UI命令发生了变化。

标签:RelayCommand,DateTime,命令,UI,机制,Now,public
From: https://www.cnblogs.com/LiuwayLi/p/16587028.html

相关文章

  • 转:批处理bat命令 获取当前盘符和当前目录和上级目录的代码
     批处理命令获取当前盘符和当前目录当前盘符:%~d0当前路径:%cd%当前执行命令行:%0当前bat文件路径:%~dp0当前bat文件短路径:%~sdp0测试12345echo当前盘符:%......
  • Docker命令速查
    Docker命令显示所有正在运行的docker容器dockerps显示所有docker容器dockerps-a运行容器dockerrun:运行一个容器并连接到它dockerrun-it:在后台运行容器......
  • 长篇图解java反射机制及其应用场景
    一、什么是java反射?在java的面向对象编程过程中,通常我们需要先知道一个Class类,然后new类名()方式来获取该类的对象。也就是说我们需要在写代码的时候(编译期或者编译期之......
  • Arthas的class和classloader相关命令-sc/sm/jad/mc/redefine/dump/classloader
    1.sc:查看JVM已加载的类信息sccom.lyb.web.mySpringBoot.demo.RedefineTestSimplesccom.lyb.web.mySpringBoot.demo.RedefineTestSimple-d   2.sm:查看已......
  • 22第四章:07_消息发送重试机制
    一、消息发送重试机制说明Producer对发送失败的消息进行重新发送的机制,称为消息发送重试机制,也称为消息重投机制。对于消息重投,需要注意以下几点:生产者在发送消息时,若......
  • LibreCAD常用命令
    [TOC]动作命令命令绘制直线相对坐标系@长度<角度绝对坐标系@x坐标,y坐标行3列2行3列3行3列4......
  • 磁盘命令管理
    linux磁盘命令管理,掌握这些就够了!点击关注......
  • CMD常用命令
    【windows党福利】CMD常用命令大全!点击关注......
  • useradd命令15个实际示例
    linux中useradd命令15个实际示例原创 入门小站 入门小站 2022-07-1623:09 发表于湖北收录于合集#Linux入门指南231个在Linux中,一个 useradd 命令是一个基础......
  • linux中使用 head,tail和cat命令高效处理文件
    linux中使用head,tail和cat命令高效处理文件原创 入门小站 入门小站 2022-07-2922:28 发表于湖北收录于合集#Linux478个1. head命令head命令读取任何给定......