Как я могу отфильтровать цифровые клавиши клавиатуры - PullRequest
2 голосов
/ 03 октября 2011

Я хочу сфокусировать определенное значение Textbox и принимать нажатие клавиши только тогда, когда пользователь нажимает цифровую клавишу (1,2,3 и т. Д.), В противном случае я не хочу фокусировать это Textbox ...

Senario:

У меня есть ListView (с настраиваемым представлением) в представлении.ниже списка у меня есть Textbox.

Допустим, ListView содержит элементы, пронумерованные как 1, 2, 3, 33, 373 и т. д.

Теперь, когда я нажимаю цифровую клавишу, скажем, Key 3, должно произойти следующее действие:

  1. Определить, что специфично TextBox
  2. Добавить текст TextBox с введенным числом
  3. Выберите элемент в ListView с тем же номером, что и TextBox.Text имеет

Мой 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 ]

4 голосов
/ 03 октября 2011

Эта логика специфична для просмотра. Это хорошо, если вы поместите его в код позади. MVVM не останавливает вас от написания определенного кода в коде позади.

Однако, если вы неукоснительно придерживаетесь подхода «без кода позади», вы можете создать Поведение и поместить весь код в него. Ваше поведение будет привязано к списку и будет принимать ссылку на текстовое поле как свойство. Он будет прослушивать событие нажатия клавиш в списке и добавлять ключи к текстовому свойству textbox.

У вас не должно быть такой логики во ViewModel

0 голосов
/ 03 октября 2011

Если вы используете 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, а затем на основе того, была ли нажата цифровая клавиша, сфокусируйте целевой текстовый блок, а также добавьте к нему символ нажатой клавиши.

    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();
                    }
                }
        }
    }
    

GetKeyCharFromKeyCode.... C # Как перевести виртуальный код клавиши в символ?

Помогает ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...