我想知道如何在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。
答案 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>