我有一个文本框,我试图将 KeyEventArgs 从视图传递到视图模型。但我不知道如何实现它。基本上我需要的是,如果输入了一些特殊字符,那么如果输入了普通文本(如 A、B、C..等),则调用一些函数,然后调用一些其他函数,如果按下 Enter 键,则调用一些函数将调用其他函数。如何在 MVVM 中执行此操作。我在 VS 2012 中使用 WPF。
问问题
7399 次
1 回答
18
有很多方法。让我一一解释。1.如果您只有一些选定的键并且在按下这些选定的键时只有一些功能要实现,那么最好的方法是以下
<TextBox x:Name="tboxCouponSearch" Text="{Binding SearchMatchHomeorVisitor,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource EfesInputTextbox}" Width="170" Height="26" AcceptsReturn="False" TabIndex="40" TextWrapping="NoWrap" KeyDown="tboxCouponSearch_KeyDown_1">
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding SearchTextboxEnterKeyCommand}"/>
<KeyBinding Key="Left" Command="{Binding LeftRightUpDownARROWkeyPressed}" />
<KeyBinding Key="Down" Command="{Binding LeftRightUpDownARROWkeyPressed}" />
<KeyBinding Key="Up" Command="{Binding LeftRightUpDownARROWkeyPressed}" />
<KeyBinding Key="Right" Command="{Binding LeftRightUpDownARROWkeyPressed}" />
</TextBox.InputBindings>
</TextBox>
在上面的示例中,您可以在单击这些特定键时看到这些命令将被执行并传递给视图模型。然后像往常一样在视图模型中调用这些函数。
2.如果要跟踪所有键而不考虑按下哪个键,那么最好使用
<TextBox x:Name="tboxCouponSearch" Text="{Binding SearchMatchHomeorVisitor,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource EfesInputTextbox}" Width="170" Height="26" AcceptsReturn="False" TabIndex="40" TextWrapping="NoWrap" KeyDown="tboxCouponSearch_KeyDown_1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyUp">
<i:InvokeCommandAction Command="{Binding SearchTextBoxCommand}" CommandParameter="{Binding Path=Text, RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
现在这将在所有按键按下或按键向上事件时触发..以及您想调用的任何函数都可以在 viewmodel 中调用。(为此,在项目的 Debug 文件夹中包括 interaction.dll 和 intereactivity.dll(您将获得在 C 驱动器的程序文件中安装 Blend 时的那些 dll。
3.如果是这样的情况,例如在某个特定键上要调用函数或在其他键的按键上要调用其他函数。那么你必须在后面的代码中做。
private void Window_KeyUp_1(object sender, KeyEventArgs e)
{
try
{
mainWindowViewModel.KeyPressed = e.Key;
通过这种方式,您可以捕获 keyeventargs .. mainWindowViewModel 是 viewModel 的一个实例。现在在视图模型中你这样做
private Key _keyPressed ;
public Key KeyPressed
{
get
{
return _keyPressed;
}
set
{
_keyPressed = value;
OnPropertyChanged("KeyPressed");
}
}
现在在 Viewmodel 中以以下方式实现此属性
bool CanSearchTextBox
{
get
{
if (KeyPressed != Key.Up && KeyPressed != Key.Down && KeyPressed != Key.Left && KeyPressed != Key.Right && MatchSearchList!=null)
return true;
else
return false;
}
}
于 2013-10-13T12:44:12.497 回答