gpt4 book ai didi

wpf - 在什么情况下 ICommand CanExecute 可能不会更新?

转载 作者:行者123 更新时间:2023-12-04 21:44:39 25 4
gpt4 key购买 nike

我一直在使用 Josh Smith's implementation of RelayCommand几年来在几个大型项目中。但是今天我遇到了一个场景,我的一个命令上的 CanExecute 没有刷新。我不知道是什么原因造成的 - View 模型没有做任何我已经做过几十次的事情。

VM 的构造函数创建了几个命令。第一个是“开始”命令:-

StartCommand = new RelayCommand(o => StartAsync(), o => true);

StartAsync() 方法如下所示:-

private async void StartAsync()
{
IsRunning = true;
await Task.Run(() => SomeLongRunningProcess(); }
IsRunning = false;
}

还有一个“保存”命令:-

SaveCommand = new RelayCommand(o => Save(), o => !IsRunning);

(“IsRunning”是一个沼泽标准属性,实现了 INotifyPropertyChanged。除了用于“CanExecute”委托(delegate)外,它还绑定(bind)到 View 中一些控件的 IsEnabled 属性以启用/禁用它们)。

当我单击“开始”按钮(绑定(bind)到“StartCommand”)时,“保存”按钮被正确禁用。 b/g 进程运行完成,然后 IsRunning 设置为 false,但这不会触发“保存”按钮变为启用状态。它仅在我单击 View 中的某处时启用。

(顺便说一句,IsEnabled 属性绑定(bind)到 VM IsRunning 属性的控件确实正确启用和禁用)。

我看过一些关于此的 SO 文章,但没有任何内容真正解释为什么会发生这种情况。我的解决方法是将按钮的 IsEnabled 属性绑定(bind)到“IsRunning”,但令人沮丧的是这个特定 View 拒绝玩球。关于可能导致此问题的任何想法?常识说这是这个 View /VM 特有的东西,但我很困惑(我不打算在这里发布代码 - 太多了)。

最佳答案

是的,因为 RelayCommand 的版本您使用的取决于 CommandManager.RequerySuggested 事件,它不准确。

它的 documentation states那个

Occurs when the CommandManager detects conditions that might change the ability of a command to execute.

基本上,它会猜测您的数据可能发生更改的所有可能事件。它永远不会知道您的 ViewModel/Model 何时更改。它没有监听属性更改通知。

如果你想立即使用react而不等待 CommandManager 猜测,你需要在模型更新时手动触发 ICommand.CanExecuteChanged

您看到事件不会触发,除非您单击窗口或其他东西,但请注意 it could fire several times too

关于wpf - 在什么情况下 ICommand CanExecute 可能不会更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35724354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com