所以我在一个输入元素上有一个简单的KeyBinding,它执行一个命令来启动一些分析。
<dxe:TextEdit.InputBindings>
<KeyBinding Key="Enter" Command="{Binding StartAnalysisCommand}" />
</dxe:TextEdit.InputBindings>
还有一些其他简单的输入元素,当更改时,在命令上调用RaiseCanExecuteChanged。这会传播到UI按钮,禁用它并阻止它执行。但是,在调用RaiseCanExecuteChanged之前和之后,KeyBinding事件似乎完全忽略了这个CanExecute状态。
答案 0 :(得分:2)
使用普通的WPF TextBox进行测试,按Enter键后调用CanExecute。确实必须是第三方控制中的问题。
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.New" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
<TextBox>
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="ApplicationCommands.New"/>
</TextBox.InputBindings>
</TextBox>
编辑:使用RelayCommand的示例:
public class ViewModel
{
private RelayCommand _cmd;
public RelayCommand Cmd {
get { return _cmd ?? (_cmd = new RelayCommand(Executed, CanExecute)); }
}
public void Executed() { throw new NotImplementedException(); }
public bool CanExecute()
{
return true;
}
}
与ViewModel的绑定作为上下文。
<KeyBinding Key="Enter" Command="{Binding Cmd}"/>
答案 1 :(得分:1)
好的,我弄清楚问题是什么。谢谢大家帮忙 - 你的答案让我意识到了这个问题。事实证明,这不是调用CanExecute的问题,而是更新绑定的时间。正在调用CanExecute,但使用之前的绑定值。
我使用this SO answer上找到的解决方案接受Enter上的值,程序现在按照我原先的预期运行。