WPF。 RelayCommand - CanExecute false,当 Execute 正在处理时

发布于 2025-01-01 21:37:54 字数 708 浏览 1 评论 0原文

我想在处理按钮的命令时禁用该按钮。

    public ICommand Search { get; set; }

    private void InitilizeSearchCommand()
    {
        Search = new RelayCommand<string>(
            param => DoSearch(param), 
            param => !_isSearchInProgress);
    }

如何修改 _isSearchInProgress?我无法在“执行”委托中执行此操作,因为它从无法访问该字段的位置(RelayCommand 对象)执行(如果我的理解是正确的):

Search = new RelayCommand<string>(
            param =>
                {
                    _isSearchInProgress = true;
                    DoSearch(param);
                    _isSearchInProgress = false;
                },
            param => !_isSearchInProgress);

提前感谢您的帮助。

I want to disable a button, while its command is processing.

    public ICommand Search { get; set; }

    private void InitilizeSearchCommand()
    {
        Search = new RelayCommand<string>(
            param => DoSearch(param), 
            param => !_isSearchInProgress);
    }

How can I modify _isSearchInProgress? I could not do it inside "Execute" delegate because it executes from place (RelayCommand object) where the field is not accessible (if my understanding is true):

Search = new RelayCommand<string>(
            param =>
                {
                    _isSearchInProgress = true;
                    DoSearch(param);
                    _isSearchInProgress = false;
                },
            param => !_isSearchInProgress);

Thanks in advance for any help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美煞众生 2025-01-08 21:37:54

解决问题的方案:

Search = new RelayCommand<string>(
            backgroundWorker.RunWorkerAsync,
            param =>
                {
                    CommandManager.InvalidateRequerySuggested();
                    return !_isSearchInProgress;
                });

应该

CommandManager.InvalidateRequerySuggested();

添加到CanExecute方法中,而不是添加到Execute中。 _isSearchInProgress 在 DoSearch() 内部更新,该 DoSearch() 在单独的线程中运行(在我的例子中为 backgroundWorker.RunWorkerAsync)。

The solution to solve the problem:

Search = new RelayCommand<string>(
            backgroundWorker.RunWorkerAsync,
            param =>
                {
                    CommandManager.InvalidateRequerySuggested();
                    return !_isSearchInProgress;
                });

The

CommandManager.InvalidateRequerySuggested();

should be added to CanExecute method, not in Execute. _isSearchInProgress is updated inside DoSearch() that is run in separate thread (backgroundWorker.RunWorkerAsync in my case).

看春风乍起 2025-01-08 21:37:54

除非您在后台线程或任务中运行,否则 GUI 不会要求 CanExecute 部分进行更新。如果您在后台执行操作,只需确保 _isSearchInProgress 不是在 any 函数内部创建的,而是类的一部分。

Unless you are running in a background thread or Task, the GUI won't be asking for updates from the CanExecute part. If you are doing stuff in the background, just make sure _isSearchInProgress is not created inside the any function, but part of the class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文