2013-10-13 18 views
8

Tôi có một hộp văn bản và tôi đang cố gắng để vượt qua KeyEventArgs từ xem để viewmodel. Nhưng tôi không biết làm thế nào để thực hiện nó. Về cơ bản những gì tôi cần là nếu một số ký tự đặc biệt được gõ thì một số hàm sẽ được gọi nếu văn bản bình thường (như A, B, C..etc) được gõ rồi một số chức năng khác sẽ được gọi và nếu phím Enter được nhấn thì một số chức năng khác sẽ được gọi. Làm thế nào để làm điều đó trong MVVM. Tôi đang sử dụng WPF với VS 2012.Vượt qua KeyEventArgs để ViewModel từ Xem trong WPF (MVVM)

Trả lời

18

Có nhiều cách tiếp cận. Hãy để tôi giải thích từng cái một. 1.If bạn đã chỉ có một số phím tắt tùy định và nhấn những khóa đã chọn chỉ có một số chức năng sẽ được thực hiện sau đó là cách tiếp cận tốt nhất là sau

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

trong ví dụ trên bạn có thể thấy trên nhấp chuột trong những chìa khóa cụ thể các lệnh này sẽ được thực thi và được truyền tới viewmodel. sau đó trong viewmodel như thường lệ, bạn có thể gọi các chức năng.

2.If tất cả chìa khóa đang được theo dõi không phụ thuộc vào thực tế mà quan trọng được nhấn sau đó tốt hơn để sử dụng

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

Bây giờ điều này sẽ cháy khi tất cả các phím xuống hoặc phím lên sự kiện .. và bất kỳ chức năng bạn muốn gọi bạn có thể gọi trong viewmodel. (để làm điều này bao gồm interact.dll và intereactivity.dll trong thư mục Debug của dự án (bạn sẽ nhận được những dll sau khi cài đặt Blend trong tập tin chương trình trong ổ đĩa C.

3 .if nó là trường hợp như trên một phím cụ thể trên chức năng là để được gọi hoặc trên phím bấm của phím khác một số chức năng khác được gọi là. sau đó bạn phải làm tôi n mã phía sau.

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

theo cách này, bạn có thể nắm bắt keyeventargs .. mainWindowViewModel là một thể hiện của viewModel. Bây giờ trong viewmodel bạn làm như thế này

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

Bây giờ trong ViewModel thực hiện tài sản này theo cách sau

bool CanSearchTextBox 
     { 
      get 
      { 
       if (KeyPressed != Key.Up && KeyPressed != Key.Down && KeyPressed != Key.Left && KeyPressed != Key.Right && MatchSearchList!=null) 
        return true; 
       else 
        return false; 
      } 
     } 
Các vấn đề liên quan