MS MVVM Toolkit中RelayCommand的CanExecute无法自动更新求助
问题解决方法
核心问题:[NotifyCanExecuteChangedFor]特性仅在Arrivals属性被重新赋值时触发命令的可执行状态更新,但你是直接修改集合内部元素(添加、清空),这类操作不会触发属性的变更通知,所以命令的CanExecute逻辑不会自动重新评估。
下面是两种可行的修复方案:
方案一:监听集合的CollectionChanged事件
在模型构造函数中,给Arrivals集合添加变更监听,每次集合内容变化时手动通知命令更新可执行状态:
internal ResultsModel() { SaveCommand = new RelayCommand(SaveRequest, CanSaveClear); ClearCommand = new RelayCommand(OnClear, CanSaveClear); // 监听集合元素变化,触发命令状态更新 Arrivals.CollectionChanged += (sender, e) => { SaveCommand.NotifyCanExecuteChanged(); ClearCommand.NotifyCanExecuteChanged(); }; }
方案二:改用异步命令优化(附带修复)
你的SaveRequest用了async void,这在MVVM命令中是不推荐的(会导致异常无法被捕获),建议改用CommunityToolkit.Mvvm提供的AsyncRelayCommand,同时保留方案一的集合监听逻辑:
// 替换命令定义 public AsyncRelayCommand SaveCommand { get; private set; } public RelayCommand ClearCommand { get; private set; } internal ResultsModel() { SaveCommand = new AsyncRelayCommand(SaveRequest, CanSaveClear); ClearCommand = new RelayCommand(OnClear, CanSaveClear); Arrivals.CollectionChanged += (sender, e) => { SaveCommand.NotifyCanExecuteChanged(); ClearCommand.NotifyCanExecuteChanged(); }; } // 修改SaveRequest为async Task async Task SaveRequest() { // 执行保存逻辑 }
另外注意代码里的小错误:model.Arrivals.insert(0, thing);应该改为model.Arrivals.Insert(0, thing);(C#方法名首字母大写)。
内容的提问来源于stack exchange,提问作者user3437436
相关产品推荐
相关产品推荐

