2013-10-13 99 views
8

我有一個文本框,我試圖將KeyEventArgs從視圖傳遞給viewmodel。但我不知道如何實現它。基本上我需要的是如果輸入一些特殊字符,那麼如果輸入普通文本(如A,B,C..etc),則會調用某個函數,然後調用其他某個函數,如果按Enter鍵,則某些其他函數是被調用的。如何在MVVM中做到這一點。我正在用VS 2012使用WPF。將KeyEventArgs傳遞給ViewModel從WPF中的視圖(MVVM)

回答

18

有很多方法。讓我一一解釋。 1.如果您只選擇了一些關鍵和緊迫的選擇鍵只是一些功能將被實現,那麼最好的辦法是在上面的例子中,以下

<TextBox x:Name="tboxCouponSearch" Text="{Binding SearchMatchHomeorVisitor,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource EfesInputTextbox}" Width="170" Height="26" AcceptsReturn="False" TabIndex="40" TextWrapping="NoWrap" KeyDown="tboxCouponSearch_KeyDown_1"> 
           <TextBox.InputBindings> 
            <KeyBinding Key="Enter" Command="{Binding SearchTextboxEnterKeyCommand}"/> 
            <KeyBinding Key="Left" Command="{Binding LeftRightUpDownARROWkeyPressed}" /> 
            <KeyBinding Key="Down" Command="{Binding LeftRightUpDownARROWkeyPressed}" /> 
            <KeyBinding Key="Up" Command="{Binding LeftRightUpDownARROWkeyPressed}" /> 
            <KeyBinding Key="Right" Command="{Binding LeftRightUpDownARROWkeyPressed}" /> 
           </TextBox.InputBindings>                
          </TextBox> 

你可以在這些特定按鍵的點擊見這些命令將被執行並傳遞給視圖模型。然後像往常一樣在viewmodel中調用函數。

2.如果所有鍵都被跟蹤,不論哪個鍵被按下,然後更好的事實,使用

<TextBox x:Name="tboxCouponSearch" Text="{Binding SearchMatchHomeorVisitor,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource EfesInputTextbox}" Width="170" Height="26" AcceptsReturn="False" TabIndex="40" TextWrapping="NoWrap" KeyDown="tboxCouponSearch_KeyDown_1">         
           <i:Interaction.Triggers> 
            <i:EventTrigger EventName="KeyUp"> 
             <i:InvokeCommandAction Command="{Binding SearchTextBoxCommand}" CommandParameter="{Binding Path=Text, RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}"/> 
            </i:EventTrigger>          
           </i:Interaction.Triggers>         
          </TextBox> 

現在這將在所有重點防火向下或向上鍵..事件,你的任何功能打電話給你可以調用viewmodel(這樣做包括interactive.dll和intereactivity.dll在項目的Debug文件夾中(你將在C驅動程序中安裝Blend之後得到這些dll文件)

3如果在某個特定的按鍵上就是這樣的功能被調用,或者在按下其他按鍵的某個其他功能時被調用。然後你必須做我後面有n個代碼。

private void Window_KeyUp_1(object sender, KeyEventArgs e) 
     { 
      try 
      { 
       mainWindowViewModel.KeyPressed = e.Key; 

以這種方式你可以捕獲keyeventargs .. mainWindowViewModel是viewModel的一個實例。 現在在視圖模型你喜歡這款

private Key _keyPressed ; 
     public Key KeyPressed 
     { 
      get 
      { 
       return _keyPressed; 
      } 
      set 
      { 
       _keyPressed = value; 
       OnPropertyChanged("KeyPressed"); 
      } 
     } 

現在,在視圖模型以下列方式

bool CanSearchTextBox 
     { 
      get 
      { 
       if (KeyPressed != Key.Up && KeyPressed != Key.Down && KeyPressed != Key.Left && KeyPressed != Key.Right && MatchSearchList!=null) 
        return true; 
       else 
        return false; 
      } 
     } 
實現此屬性
相關問題