的RelayCommand CanExecute行为不起作用
作者:互联网
我在获取RelayCommand来正确启用/禁用附加控件时遇到麻烦.
我已经将EventToCommand元素附加到按钮上.该命令已数据绑定到ViewModel.最初,该按钮被禁用(预期行为),但是我似乎无法获取CanExecute逻辑来检查其值.当CurrentConfigFile设置并存在时,应启用该按钮.我已经执行了代码,并在调试中检查了文件的值以确保已设置该文件的值,但该控件仍处于禁用状态.我已经尝试过CommandManager.InvalidateRequerySuggested()和command.RaiseCanExecuteChanged(),但不会启用.
我想知道lambda对于CanExecute行为是否无法正常工作(即使示例使用了它们)还是CanExecute行为需要数据绑定到另一个元素.
这是我的代码:
// The FileInfo being checked for existence before the button should be enabled
public const string CurrentConfigFilePN = "CurrentConfigFile";
public FileInfo CurrentConfigFile
{
get
{
return _currentConfigFile;
}
set
{
if (_currentConfigFile == value)
{
return;
}
var oldValue = _currentConfigFile;
_currentConfigFile = value;
// Update bindings, no broadcast
RaisePropertyChanged(CurrentConfigFilePN);
}
}
public MainViewModel()
{
// snip //
SaveCommand = new RelayCommand(SaveConfiguration,
() => CurrentConfigFile != null && CurrentConfigFile.Exists);
}
private void SaveConfiguration()
{
// export model information to xml document
ExportXMLConfiguration(CurrentConfigFile);
}
和标记
<Button x:Name="SaveButton" Content="Save" Width="75" Margin="20,5">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<GalaSoft:EventToCommand x:Name="SaveETC"
Command="{Binding SaveCommand}"
MustToggleIsEnabledValue="true" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
更新:
根据Isak Savo的建议,我将RelayCommand直接绑定到带有
<Button x:Name="SaveButton" Content="Save" Width="75" Margin="20,5"
Command="{Binding SaveCommand}"/>
并在设置FileInfo时开始禁用并正确启用.猜猜我应该记得不要修复未损坏的东西!
解决方法:
为什么不直接从Button绑定到Command?
<Button Command="{Binding SaveCommand}" Content="Save" />
也许您正在使用的EventToCommand东西使命令的CanExecute通知变得混乱.
关于CanExecute问题-您确定在设置CurrentConfigFile属性后调用CanExecute处理程序吗?我发现即使WPF在重新查询CanExecute方面做得很好,但有时我仍然需要强制通过CommandManager进行重新查询.
编辑:如评论中指出,OP已经尝试了命令管理器方法.
标签:mvvm-light,wpf,c 来源: https://codeday.me/bug/20191209/2096561.html