You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:18:33