wpf RelayCommand的CanExecute 没有触发的原因

问题描述

使用MVVM RelayCommand CanExecute 进行按钮禁用控制,偶尔会出现CanExecute 一直不触发。

如图CanExecute 一直没触发,导致按钮本应该可用,这里一直不可用。在这里插入图片描述
而且出现这个问题后,只要鼠标或键盘点击任意一处地方(可以是电脑屏幕的任何一个图标)就能马上触发CanExecute事件,真神奇。

问题定位

通过测试发现,页面Load事件数据量大时,不会出现这个问题。只会在数据少页面响应很快时,就会出现这个问题。
顺着排查,发现再Load事件内使用了await Task.Delay(20) 使用await Task.Delay异步线程睡眠,CPU会被调度到其它地方。可能会导致这个页面焦点被改变,焦点改变CanExecute就触发不了了。

问题修改

把页面Load事件内的await Task.Delay 修改为 Thread.Sleep 问题解决!

Task.Factory.StartNew(async () =>
                          {
                             var resobj= await this.service.StartCheck(this.IsRequest, this.isGetCurWeekAfterData);
                              int count = 0;
                              Load(classObject);
                              count += classObject.RequestTree?.Count()?? 0;
                              Thread.Sleep(20);
                              //await Task.Delay(20); 会导致mvvm Command CanExecute 不触发,数据量少的时候可以必现此问题 Lv
                             //...
                          });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值