WPF中ViewModel绑定更新后数量调整按钮无法自动切换启用状态
问题根因
你所使用的DelegateCommand不会自动感知CanExecute依赖的属性变更,WPF命令体系默认仅在焦点切换、输入事件触发等场景下才会自动重新校验命令可执行状态,你修改NumValue属于业务逻辑层面的数值变更,不会触发命令状态的自动刷新。同时你目前的代码只通知了CanDecrease的属性变更,缺少CanIncrease的变更通知,也是增加按钮状态不更新的原因之一。
修复步骤
- 在
NumValue的属性赋值块中,补充CanIncrease的属性变更通知,同时调用两个命令的RaiseCanExecuteChanged方法,手动通知UI刷新命令的可执行状态 - (可选优化)
DelegateCommand会自动控制绑定按钮的IsEnabled状态,无需重复绑定IsEnabled属性,可删除cmdDown按钮上的IsEnabled="{Binding CanDecrease}"代码避免冲突
修改后的ViewModel核心代码
public class QuantityModalViewModel : ViewModelBase { private int _numValue; public QuantityModalViewModel() { _numValue = 1; DecreaseQuantityCommand = new DelegateCommand(DecreaseQuantity, () => CanDecrease); IncreaseQuantityCommand = new DelegateCommand(IncreaseQuantity, () => CanIncrease); } public DelegateCommand IncreaseQuantityCommand { get; } public DelegateCommand DecreaseQuantityCommand { get; } public int NumValue { get { return _numValue; } set { _numValue = value; RaisePropertyChanged(); // 补充两个判断属性的变更通知 RaisePropertyChanged(nameof(CanDecrease)); RaisePropertyChanged(nameof(CanIncrease)); // 手动触发命令状态刷新 IncreaseQuantityCommand.RaiseCanExecuteChanged(); DecreaseQuantityCommand.RaiseCanExecuteChanged(); } } public bool CanDecrease => NumValue >= 2; public bool CanIncrease => NumValue < 99; public void IncreaseQuantity() { NumValue++; } public void DecreaseQuantity() { NumValue--; } }
补充说明
如果你使用的是第三方MVVM框架,部分框架的DelegateCommand刷新状态的方法名可能略有差异,主流的Prism、MVVM Light框架均使用RaiseCanExecuteChanged作为方法名,直接调用即可生效。
内容的提问来源于stack exchange,提问作者MrG-O-L
相关产品推荐
相关产品推荐

