WPF中ICommand的CanExecute状态未更新问题求助
问题原因及解决办法
你遇到的问题主要有两个关键点,咱们一步步拆解:
核心问题:CommandParameter未绑定
你的NewCommand的CanExecute方法依赖传入的parameter来判断是否可执行,但你的Button并没有把TextBox的文本(也就是ViewModel里的TextB)作为参数传递给命令!
看你的XAML里的Button:
<Button Command="{Binding Path=NewCommand}" FontSize="128">New</Button>
这里没有设置CommandParameter,所以CanExecute(object parameter)里的parameter永远是null,你的判断条件!((string)parameter == "sample")就永远为true——不管TextBox里输入什么,按钮都会保持启用状态。
次要问题:属性变化时未强制命令重查询
WPF的CommandManager.RequerySuggested虽然会在一些UI操作后自动触发命令状态重评估,但有时候ViewModel的属性变化不会被它自动捕获到,这时候需要咱们手动触发重查询。
具体修复步骤
1. 给Button添加CommandParameter绑定
修改XAML中的Button,把TextB作为命令参数传进去:
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBox Text="{Binding TextB}"></TextBox> <Button Command="{Binding Path=NewCommand}" CommandParameter="{Binding TextB}" FontSize="128">New</Button> </StackPanel>
2. 在TextB属性变化时手动触发命令重查询
修改ViewModel中TextB的setter方法,当文本变化时强制让CommandManager重新评估所有命令的CanExecute状态:
public string TextB { get => _textB; set { if (_textB == value) return; _textB = value; OnPropertyChanged(nameof(TextB)); // 强制命令重新检查可执行状态 CommandManager.InvalidateRequerySuggested(); } }
现在再测试:当你在TextBox里输入"sample"时,按钮会自动禁用;输入其他内容时,按钮恢复启用状态,点击也能正常弹出消息框。
内容的提问来源于stack exchange,提问作者AdmiralCat3
相关产品推荐
相关产品推荐

