相关疑难解决方法(0)

CommandManager.InvalidateRequerySuggested()不够快.我能做什么?

精简版

调用CommandManager.InvalidateRequerySuggested()比我想要的更长时间才能生效(在UI控件被禁用之前1-2秒延迟).

长版

我有一个系统,我将任务提交给基于后台线程的任务处理器.此提交发生在WPF UI线程上.

当这个提交发生时,管理我的后台线程的对象做了两件事:

  1. 它引发了一个"忙"事件(仍然在UI线程上),几个视图模型响应; 当他们收到这个事件时,他们IsEnabled会给自己设置一面旗帜false.我的视图中的控件(数据绑定到此属性)会立即显示为灰色,这正是我所期望的.

  2. 它通知我的WPF ICommand对象不应该允许它们执行(同样,仍然在UI线程上).因为没有像对象那样INotifyPropertyChangedICommand东西,我被迫调用CommandManager.InvalidateRequerySuggested()强制WPF重新考虑我的所有命令对象的CanExecute状态(是的,我实际上需要这样做:否则,这些控件都不会被禁用).但是,与第1项不同,我的按钮/菜单项/等使用ICommand对象在视觉上更改为禁用状态所需的时间要长得多,而对于IsEnabled手动设置其属性的UI控件则需要更长的时间.

问题是,从用户体验的角度来看,这看起来很糟糕 ; 我的一半控件立即显示为灰色(因为它们的IsEnabled属性设置为false),然后整整1-2秒后,我的控件的另一半跟随(因为他们的CanExecute方法最终被重新评估).

所以,我的问题的第一部分:
听起来很愚蠢,有没有办法让CommandManager.InvalidateRequerySuggested()我的工作更快?我怀疑没有.

很公平,我的问题的第2部分:
我如何解决这个问题?我希望我的所有控件都可以同时禁用.它只是看起来不专业而且很尴尬.有任何想法吗?:-)

wpf icommand

33
推荐指数
2
解决办法
2万
查看次数

CommandManager.InvalidateRequerySuggested不会导致MVVM-Light中的CanExecute重新查询

我正在使用MVVM-Light RelayCommand

private ICommand myRevertCmd;
public ICommand Revert
    {
        get
        {
            if (myRevertCmd == null)
            {
                myRevertCmd = new RelayCommand(RevertExecute, CanRevertExecute);
            }

            return myRevertCmd;
        }
    }

    private void RevertExecute()
    {
        searchType = SearchType.Revert;
        SearchStart();
    }

    private bool CanRevertExecute()
    {
        return isRevertEnabled;
    }
Run Code Online (Sandbox Code Playgroud)

我有一些代码可以更改isRevertEnabled的值,但链接按钮不会更改.经过一些搜索,我发现你可以用来强制重新评估按钮状态

// force the GUI to re-evaluate the state of the buttons
CommandManager.InvalidateRequerySuggested();
Run Code Online (Sandbox Code Playgroud)

但这不起作用.有没有人有什么建议?

wpf mvvm-light

8
推荐指数
3
解决办法
9848
查看次数

标签 统计

wpf ×2

icommand ×1

mvvm-light ×1