2016-02-29 47 views
0

我的WPF应用程序不时的用户能够触发两次绑定到按钮的命令。绑定到该按钮的命令被触发两次

XAML代码:

<Button x:Name="btnAccept" 
      Style="{StaticResource FlatButtonLarge}" 
      Height="42" 
      Command="{Binding Path=SubmitCmd}" 
      Content="Submit" /> 

我有同样键绑定

<Window.InputBindings> 
    <KeyBinding Key="F9" Command="{Binding SubmitCmd}" /> 
</Window.InputBindings> 

我无法重现错误,但基于中我总结出命令被解雇了两次数据库的变化一次又一次。它真的是可行的吗?我怎样才能防止这种现象。 SubmitCmd将新记录添加到数据库并关闭表单。

这里是后面的代码:

vm.SubmitCmd = new RelayCommand(pars => DoSubmit(), pars => vm.CmdSubmitCanExecute, "Submit"); 

    private void DoSubmit() 
    { 
     try 
     { 
      if (!vm.LaunchAllowed) 
      { 
       this.Close(); 
      } 
      else 
      { 
       vm.LaunchAllowed = false; 
       bool isOk = DBService.SaveToDB(vm.Dto); 

       if (isOk) 
       { 
        DialogResult = true; 
        this.Close(); 
       } 
       else 
       { 
        ShowError(this, result); 
        vm.LaunchAllowed = true; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      ShowError(this, ex.Message); 
      vm.LaunchAllowed = true; 
     } 
    } 

和视图模型代码:我觉得我看到这个太

public ICommand SubmitCmd{ get; set; } 

    public bool CmdSubmitCanExecute 
    { 
     get 
     { 
      return LaunchAllowed; 
     } 
    } 
+0

你可以显示'SubmitCmd'的代码吗? – Valentin

回答

0

,但是 - 你 - 我无法重现它。这也是我的结论。

为了解决这个问题,我在命令运行后立即禁用了按钮。所以假设你使用mvvm,给它添加一个属性(不要忘记引发属性改变的事件)并绑定你的按钮的IsEnabled属性

+0

我alrerady做到了。 Property LaunchAllowed就是这样一个属性。该属性控制是否可以触发命令。你认为这还不够(见我的ViewModel代码)? – iljon

+0

好的,但你应该在命令中激活CanExecuteChanged-Event: – unkreativ

+0

你是否建议在DoSubmit()过程的开始时将CommandManager.InvalidateRequerySuggested()放置在右边? – iljon