Ich habe ein Textfeld und ich versuche, KeyEventArgs von Ansicht zu Viewmodel zu übergeben. Aber ich weiß nicht, wie Sie es implementieren. Was ich brauche, ist, wenn ein spezielles Zeichen eingegeben wird, dann wird eine Funktion aufgerufen, wenn normaler Text (wie A, B, C..etc) getippt wird, dann eine andere Funktion aufgerufen wird und wenn die Eingabetaste gedrückt wird, dann einige andere Funktion ist zu nennen.Wie es in MVVM zu tun. Ich verwende WPF mit VS 2012.KeyEventArgs zu ViewModel aus Sicht in WPF (MVVM) übergeben
Antwort
Es gibt viele Ansatz. Lassen Sie mich erklären alle nacheinander. 1. Wenn Sie haben einige nur ausgewählte Taste und auf nur eine Funktion diesen ausgewählten Taste geführt werden sollen, dann ist der beste Ansatz die folgt
<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>
in dem obigen Beispiel können Sie auf Klick auf diese spezifischen Schlüssel sehen Diese Befehle sollen ausgeführt und an das Viewmodel übergeben werden. dann können Sie wie gewohnt im ViewModel die Funktionen aufrufen.
2.if alle Schlüssel Verfolgt werden unabhängig von der Tatsache sein, die Schlüssel dann besser gedrückt wird
<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>
Nun wird diese nach unten auf alle wichtigen Feuer verwenden oder Ereignisse Taste nach oben .. und jede Funktion, die Sie Ich möchte Sie anrufen können in ViewModel aufrufen. (Dazu gehören interaction.dll und intereactivity.dll im Debug-Ordner des Projekts (Sie erhalten diese DLL bei der Installation von Blend in der Programmdatei in C-Laufwerk.
3 .Wenn es der Fall ist, wie auf einer bestimmten Taste auf Funktion aufgerufen werden soll oder auf Tastendruck einer anderen Taste einige andere Funktion aufgerufen werden. Dann müssen Sie ich tun n Code dahinter.
private void Window_KeyUp_1(object sender, KeyEventArgs e)
{
try
{
mainWindowViewModel.KeyPressed = e.Key;
auf diese Weise können Sie die KeyEventArgs fangen .. mainWindowViewModel eine Instanz von Viewmodel ist. Jetzt in Viewmodel gefallen Ihnen diese
private Key _keyPressed ;
public Key KeyPressed
{
get
{
return _keyPressed;
}
set
{
_keyPressed = value;
OnPropertyChanged("KeyPressed");
}
}
Jetzt in Ansichtsmodell diese Eigenschaft in der
bool CanSearchTextBox
{
get
{
if (KeyPressed != Key.Up && KeyPressed != Key.Down && KeyPressed != Key.Left && KeyPressed != Key.Right && MatchSearchList!=null)
return true;
else
return false;
}
}
folgenden Art und Weise implementieren