【问题标题】: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源代码。

标签: c# wpf mvvm command 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 将返回其启用状态。
  • 是的,其实我会异步做所有事情
猜你喜欢
  • 2019-08-15
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多