2013-04-15 7 views
1

Я хотел бы знать, как я могу обработать событие KeyDown с MVVM в моей модели ViewModel.Mvvm TextBox Событие KeyDown

У меня есть TextBox, и когда пользователь нажимает клавишу, которая не является числом, вход не должен быть разрешен. Я обычно делаю это с кодом позади, как это (не полный код, просто простой пример):

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 

    // Determine whether the keystroke is a number from the top of the keyboard. 
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9) 
    { 
     e.Handled = true; 
    } 
} 

Теперь я хочу, чтобы поставить это как-то в моем ViewModel с командой. Я новичок в MVVM, и сейчас я использую Bindings (отлично работает :)), но я не знаю, как использовать команду вообще ...

My TextBox выглядит так:

<TextBox Text="{Binding MyField, Mode=TwoWay}"/> 

ViewModel:

private string _myfield; 
public string MyField{ 
    get { return _myfield; } 
    set { 
    _myfield= value; 
    RaisePropertyChanged(()=>MyField) 
    } 
} 

Но сеттер будет называться только, когда я выхожу из TextBox + у меня нет доступа к введенному ключ.

+0

возможно дубликат: http://stackoverflow.com/questions/612966/keyboard-events-in-a-wpf-mvvm-application – walther

+0

Спасибо. Другой вопрос: I.e. Я нажимаю на свой TextBox, это также приведет к событию GotFocus? У меня есть десятичное текстовое поле со стандартным значением 0.00. Когда я нажимаю в TextBox, значение должно быть «» (если значение 0.00 находится в TextBox). Я вижу, что UpdateSourceTrigger будет поднимать мой сеттер каждый раз, когда я ввожу что-то, и что мне нужно будет проверить/установить значение в зависимости от ввода ... Во всяком случае, «KeyDown» работает, но как насчет GotFocus? PS: Этот вопрос показывает, как поднять событие при нажатии клавиши, но я хочу обрабатывать все события KeyDown, а не специальный ключ. (Без кода) – Rudi

ответ

3

Я делаю это с помощью триггеров взаимодействия. (В этом примере используется каркас MVVM_Light для команды связывания)

вот пример:

<textBox Text="{Binding MyField}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="KeyDown"> 
      <cmd:EventToCommand Command="{Binding MyCommandName}" CommandParameter="YouCommandParameter"/> 
     </i:EventTrigger> 
     </i:Interaction.Triggers> 
<TextBox/> 

Создание объекта ICommand в вашей модели представления с именем MyCommandName и добавить их в верхней части XAML:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:cmd="http://www.galasoft.ch/mvvmlight" 

Вам не нужно использовать команду mvvm-light. Это как раз то, что я использую, и мне это нравится, потому что это позволяет мне использовать метод CanExecute интерфейса ICommand

надеюсь, что это помогает

5

Я знаю, что мой ответ запаздывает, но если кто-то имеет такую ​​же проблему. Вы должны просто установить текстовое поле, как это:

<TextBox Text="{Binding MyField, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
+0

Это замечательно и просто. Чтобы развернуть это, я нашел следующую дополнительную информацию о том, как она работает: https://www.codeproject.com/Articles/507883/UpdateSourceTrigger-Property-in-WPF-Binding. Отличный материал, спасибо! – gbdavid

1

следующие работы для обработки «Enter» ключ в TextBox:

<TextBox Text="{Binding UploadNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
    <TextBox.InputBindings> 
     <KeyBinding 
      Key="Enter" 
      Command="{Binding FindUploadCommand}" /> 
    </TextBox.InputBindings> 
</TextBox> 
Смежные вопросы