zoukankan      html  css  js  c++  java
  • WPF中异步更新Command可用逻辑时按钮状态没有更新

      在这样一种场景,通过点击一个按钮来执行一段耗时的逻辑,在这段逻辑执行完时设置另外一个按钮的可用状态,通过CanExecuted影响。示例如下:

      

      其中,扫行逻辑的代码如下:

      

            private ICommand _setWaitCommandExecuted;
    
            public ICommand SetWaitCommandExecuted
            {
                get
                {
                    if (null == _setWaitCommandExecuted)
                        _setWaitCommandExecuted = new RelayCommand(() =>
                        {
                  //异步线程 Task.Run(()
    => { System.Threading.Thread.Sleep(1000);//模拟耗时操作 CanWaitExecuted = true;//设置Wait的状态可用,对于Wait的Command中的CanExecuted,只是简单的返回该值 }); }); return _setWaitCommandExecuted; } }

      F5运行结果如下:

      UI上Wait的按钮没有刷新。这是一个问题。经过从网上查找资源,发现了一种解决方式。

      方案一:

      既然UI上绑定按钮的状态没有刷新,那就用一种比较霸道的方式,强制让UI刷新按钮的状态,即调用CommandManager.InvalidateRequerySuggested()这段代码。注意这句代码需要封送到UI线程中执行。

      方案二:

      出现该问题的一个原因在于异步线程中列新按钮的逻辑,那么将这段逻辑封送到UI线程中会不会解决问题呢?这里就不志关子了,实验是可以的。下面就贴出两种方案的示例代码,大家可以自行试验。

    public ICommand SetWaitCommandExecuted
            {
                get
                {
                    if (null == _setWaitCommandExecuted)
                        _setWaitCommandExecuted = new RelayCommand(() =>
                        {
                            Task.Run(() =>
                            {
                                ////window.Invoke(() =>
                                ////{
                                ////    //模拟一个耗时操作
                                ////    System.Threading.Thread.Sleep(1000);
                                ////    //方案一:在UI线程中更改
                                ////    CanWaitExecuted = true;
                                ////});
    
                                //System.Threading.Thread.Sleep(1000);
                                //CanWaitExecuted = true;
                                ////方案二:UI线程中进行强制刷新
                                //window.Invoke(CommandManager.InvalidateRequerySuggested);
                            });
                        });
                    return _setWaitCommandExecuted;
                }
            }
  • 相关阅读:
    frp最简配置 实现内网穿透(访问内网WEB服务器)
    frp最简配置 实现内网穿透(访问内网其他服务器SSH)
    Linux 进程树查看工具 pstree
    svn Server authz 配置示例(文件夹权限配置)
    centos7 安装 mysql5.7.25
    centos7中将tomcat注册为系统服务
    keepalived 配置文件解析
    datatables参数配置详解
    使用jquery.datatable.js注意事项
    ondblclick和dblclick区别
  • 原文地址:https://www.cnblogs.com/maigc249/p/4550068.html
Copyright © 2011-2022 走看看