2013-10-13 15 views
8

Mam pole tekstowe i próbuję przekazać KeyEventArgs z widoku do viewmodel. Ale nie wiem, jak go wdrożyć. Zasadniczo potrzebuję tego, że jeśli zostanie wpisany jakiś znak specjalny, to zostanie wywołana jakaś funkcja, jeśli zostanie wpisany zwykły tekst (np. A, B, C..etc), a następnie zostanie wywołana jakaś inna funkcja i jeśli zostanie naciśnięty klawisz Enter, to niektóre należy wywołać inną funkcję. Jak to zrobić w MVVM. Używam WPF z VS 2012.Zdaj KeyEventArgs do ViewModel z widoku w WPF (MVVM)

Odpowiedz

18

Istnieje wiele podejść. Pozwól mi wyjaśnić wszystkie jeden po drugim. 1.If masz tylko niektóre wybrane klucz i po naciśnięciu klawisza te wybrane tylko niektóre funkcje mają być realizowane wówczas najlepszym rozwiązaniem jest następujący

<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> 

w powyższym przykładzie widać na kliknięcie tych określonego klucza te polecenia mają zostać wykonane i przekazane do viewmodel. następnie w viewmodel jak zwykle możesz wywoływać funkcje.

2.if wszystkie kluczowe mają być śledzone niezależnie od tego, który przycisk został naciśnięty wtedy lepiej użyć

<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> 

Teraz to zadziała na wszystkich kluczowych w dół lub w górę klucz wydarzenia .. i każda funkcja ty chciałbym zadzwonić można zadzwonić w viewmodel. (aby to zrobić to interaction.dll i intereactivity.dll w folderze Debug projektu (otrzymasz te dll po instalacji Blend w pliku programu na dysku C.

3 .Jeśli tak jest, to jak na danym klawiszu funkcja ma być wywołana lub klawiszem innego klawisza wywołaj inną funkcję, która ma być wywołana. n kod za.

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

w ten sposób można złapać keyeventargs .. mainWindowViewModel jest instancją ViewModel. Teraz w viewmodel zrobić jak ten

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

Teraz w ViewModel implementuje tej właściwości w następujący sposób

bool CanSearchTextBox 
     { 
      get 
      { 
       if (KeyPressed != Key.Up && KeyPressed != Key.Down && KeyPressed != Key.Left && KeyPressed != Key.Right && MatchSearchList!=null) 
        return true; 
       else 
        return false; 
      } 
     }