Mvvm TextBox KeyDown事件

时间:2013-04-15 21:16:00

标签: events mvvm keydown

我想知道如何在ViewModel中使用MVVM处理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;
    }
}

现在我想用一个Command以某种方式将它放在我的ViewModel中。我是MVVM的新手,我现在只使用Bindings(工作正常:)),但我根本不知道如何使用Command ...

我的TextBox看起来像这样:

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

视图模型:

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

但是只有当我离开TextBox +我才能调用setter时,我无法访问输入的Key。

3 个答案:

答案 0 :(得分:5)

我知道我的答案很晚,但如果有人遇到类似的问题。您必须像这样设置文本框:

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

答案 1 :(得分: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/>

在视图模型中使用名称MyCommandName创建一个ICommand对象,并将它们添加到xaml的顶部:

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

您不必使用mvvm-light命令。这正是我使用的,我喜欢它,因为它允许我使用ICommand接口的CanExecute方法

希望这会有所帮助

答案 2 :(得分:1)

以下用于处理TextBox中的“Enter”键:

<TextBox Text="{Binding UploadNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding 
          Key="Enter" 
          Command="{Binding FindUploadCommand}" />
    </TextBox.InputBindings>
</TextBox>