单击时如何使命令不禁用按钮

Posted

技术标签:

【中文标题】单击时如何使命令不禁用按钮【英文标题】:How to make command not disable button when clicked 【发布时间】:2015-09-05 06:20:50 【问题描述】:

我目前正在 MVVM 中开发一个应用程序。 我正在使用所有按钮 RelayCommand 来执行操作。事实是,使用 RelayCommand,按钮在单击时被禁用,即命令执行的时间。 因为我们的渲染引擎有点重,当我们打开一个新窗口时,按钮会保持禁用状态,比如一秒钟。

我的问题是:有没有办法禁用此行为并启用按钮,因为它会改变样式? 更改禁用样式不是一种选择...

我没有在网上或文档中看到这种行为?

谢谢

编辑:

我的 RelayCommand 的两种不同实现

        AnswerCommand = new RelayCommand(p => AnswerMail(p), p => IsMailSelected());
        DeleteMailCommand = new RelayCommand(p => Task.Run(() => DeleteMail()), p => IsMailSelected());

【问题讨论】:

你的命令CanExecute条件是什么? 在某些情况下我没有。该按钮仅禁用函数执行运行的时间 请在此处发布您的RelayCommand 实现。即RelayCommand源代码。 【参考方案1】:

我认为您应该同步对 ICommand 实例 Execute 方法中存在的块的访问,并且每次到达那里时,启动一个新线程。如果您想多次单击该按钮,则将锁定部分放在那里,会将您的呼叫排在队列中。如果你想在它还在工作的时候拒绝收到的请求,你可以实现 balking 模式。

https://en.wikipedia.org/wiki/Balking_pattern

这样,当创建的线程启动时,您的按钮将不再被禁用。

我不确定这种方法是否对您有帮助,但我认为这是一个可行的方案。

还有一件事,我刚刚发现了这个:

Patterns for Asynchronous MVVM Applications: Commands

我以前没用过,但看起来不错,今晚我会试一试。祝你好运!

【讨论】:

我想要做的主要目标是在单击按钮时不应用禁用样式,如果它实际上阻塞了 UI 线程则发生事件;顺便说一句,我的许多命令都是异步的(例如 new RelayCommand(p => Task.Run(() => MysAyncFunc())),但我有一点时间禁用按钮 @cdie 如果您将耗时的工作发送到另一个线程,您的 Execute 方法将立即返回,并且 Button 将返回其启用状态。 是的,其实我会异步做所有事情

以上是关于单击时如何使命令不禁用按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何使用状态仅禁用我单击的按钮

可拖动按钮时如何将单击事件设置为禁用?

如何在按钮单击时启用和禁用 jquery dataTables 的分页

单击时从循环中禁用按钮

单击不是提交按钮后如何禁用html按钮

单击属于表单的另一个按钮时如何禁用提交表单