System.Windows.Input.KeyBinding不检查CanExecute

时间:2014-06-30 17:24:21

标签: wpf validation

所以我在一个输入元素上有一个简单的KeyBinding,它执行一个命令来启动一些分析。

<dxe:TextEdit.InputBindings>
    <KeyBinding Key="Enter" Command="{Binding StartAnalysisCommand}" />
</dxe:TextEdit.InputBindings>

还有一些其他简单的输入元素,当更改时,在命令上调用RaiseCanExecuteChanged。这会传播到UI按钮,禁用它并阻止它执行。但是,在调用RaiseCanExecuteChanged之前和之后,KeyBinding事件似乎完全忽略了这个CanExecute状态。

2 个答案:

答案 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上的值,程序现在按照我原先的预期运行。