2016-02-29 67 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