3

我想知道如何在 ViewModel 中使用 MVVM 处理 KeyDown 事件。

我有一个 TextBox,当用户按下不是数字的键时,不应允许输入。我通常会像这样使用 Code behind(不是完整的代码,只是一个简单的例子):

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(效果很好:)),但我根本不知道如何使用命令......

我的 TextBox 看起来像这样:

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

视图模型:

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

但是只有当我离开 TextBox + 我无权访问输入的密钥时,才会调用 setter。

4

3 回答 3

9

我知道我的回答迟了,但如果有人有类似的问题。你必须像这样设置你的文本框:

<TextBox Text="{Binding MyField, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
于 2014-06-17T12:53:50.990 回答
4

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

<TextBox Text="{Binding UploadNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding 
          Key="Enter" 
          Command="{Binding FindUploadCommand}" />
    </TextBox.InputBindings>
</TextBox>
于 2016-06-09T07:05:35.547 回答
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 方法

希望这可以帮助

于 2013-04-15T21:34:08.750 回答