如何过滤键盘数字键

时间:2011-10-03 10:57:56

标签: wpf mvvm keypress

我希望关注特定的Textbox并仅在用户按下数字键(1,2,3等)时接受按键,否则我不想关注Textbox ...

塞纳里奥:

我在视图中有ListView(有自定义视图)。在列表视图下方,我有一个Textbox

让我们说ListView包含编号为1,2,3,33,373等的项目。

现在,当我按一个数字键时,让我们说Key 3,应该会发生以下操作:

  1. 专注于TextBox
  2. 使用数字输入
  3. 附加TextBox文字
  4. 选择ListView中与TextBox.Text具有相同编号
  5. 的项目

    我尝试的Xaml

    <ListView Name="lv"
                  Grid.Row="1"
                  ItemsSource="{Binding}"
                  View="{Binding Path=SelectedItem,
                                 ElementName=viewComboBox}" DisplayMemberPath="Name" IsTextSearchEnabled="True" TextSearch.TextPath="{Binding Path=Person.Name}"/>
        <TextBox  Grid.Row="2" Text="{Binding Path=TextSearch.Text,ElementName=lv}"></TextBox>  
    

    TextBox中没有显示任何内容,我不知道如何处理数字键按下。

    我需要这个并且使用MVVM令人困惑......

    在这方面的任何帮助都会很棒。使用代码的一些指导会更好......谢谢......

2 个答案:

答案 0 :(得分:4)

此逻辑特定于视图。如果你把它放在代码后面就好了。 MVVM不会阻止您在代码中编写特定于视图的代码。

但是,如果您虔诚地遵循“无代码隐藏”方法,那么您可以创建Behavior并将所有代码放入其中。您的行为将附加到列表框,并将文本框引用作为属性。它将侦听列表框上的keydown事件,并将键添加到文本框的文本属性中。

你不应该在ViewModel

中拥有这样的逻辑

答案 1 :(得分:0)

如果您使用的是MVVM,则可以采用附加行为 ...... http://eladm.wordpress.com/2009/04/02/attached-behavior/

  1. 将您的按键命名为ListView ...

    <ListView x:Name="MyListView">
       ....
    </ListView>
    
  2. 声明并定义ListView类型的附加属性,说NumericKeyPressBehavior.FocusTarget

  3. FocusTarget的来源将是MyListView,行为将附加到您的TextBox

     <TextBox local:NumericKeyPressBehavior.FocusTarget="{Binding ElementName=MyListView}" 
              .... />
    
  4. NumericKeyPressBehavior.FocusTarget的依赖属性更改事件处理程序中,按下ListView上的按键,然后根据是否按下数字键,聚焦目标TextBox并将按下的键字符附加到它

    private static void  OnFocusTargetChanged(
        DependencyObject o, 
        DependencyPropertyChangedEventArgs e)
    {
        var textBox = o as TextBox;
        var listView = e.NewValue as ListView;
        if (textBox != null && listView != null)
        {
            listView.KeyUp += 
             (o1, e1) =>
                {
                    var keyChar = GetKeyCharFromKeyCode(e1.Key);
                    if ("0123456789".Contains(keyChar.ToString()))
                    {
                        textBox.Focus();
                        textBox.Text += keyChar.ToString();
                    }
                }
        }
    }
    
  5. 在此处找到

    GetKeyCharFromKeyCode .... C# How to translate virtual keycode to char?

    这有帮助吗?