WPF und MVVM : Wie verschieben Sie den Fokus auf das nächste Steuerelement automatisch
Ich habe eine kleine WPF-Fenster mit 2 Textboxen Bestellt TabIndex 0,1 und ich möchten verschieben Sie den Fokus automatisch von der ersten TextBox zur zweiten, wenn ich die Enter-Taste drücken.
Ich verwende MVVM Light.
Bemerkung : Dieser Beitrag ist nicht doppelt vorhanden. hier meine ich nicht den Klassischen Ansatz mit event-Handler, aber MVVM-Pattern, und wie Sie wissen, der Code Dahinter ist, dürfen Sie nicht in Sicht.
Ich habe eine Lösung Gefunden aber ich weiß nicht, ob es Respekt MVVM-Prinzip.
Hier der code :
Ansicht
<Window x:Class="WpfMMVLight2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:cmd ="http://www.galasoft.ch/mvvmlight"
Title="MainWindow" Height="350" Width="525"
DataContext="{Binding MainViewModel}">
<Grid FocusManager.FocusedElement="{Binding ElementName=tb1}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="70"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Text="Text 1" VerticalAlignment="Center"/>
<TextBox x:Name="tb1" Grid.Column="1" VerticalAlignment="Center" Margin="5">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cmd:EventToCommand PassEventArgsToCommand="True"
Command ="{Binding KeyDownCommand, Mode=OneWay}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
<TextBlock Grid.Column="0" Grid.Row="1" Text="Text 2" VerticalAlignment="Center"/>
<TextBox x:Name="tb2" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Margin="5">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cmd:EventToCommand PassEventArgsToCommand="True"
Command ="{Binding KeyDownCommand, Mode=OneWay}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
</Grid>
ViewModel :
private ICommand _keydownCommand;
public ICommand KeyDownCommand
{
get
{
if (_keydownCommand== null)
_keydownCommand= new DelegateCommand<KeyEventArgs>(KeyDownCommandExecute);
return _keydownCommand;
}
}
private void KeyDownCommandExecute(KeyEventArgs e)
{
if (e != null && e.Key == Key.Enter)
{
TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next);
request.Wrapped = true;
((Control)e.Source).MoveFocus(request);
}
}
}
Ich weiß nicht, ob die Verwendung des "Control" - Klasse im ViewModel erlaubt Ist oder nicht
InformationsquelleAutor Habib Gherairi | 2014-04-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Sie mit MVVM, die Sie verwenden können, ein Verhalten, für das:
Im xaml-Code:
Vielen Dank für die gute Lösung. Ich habe sehr textbox auf Projekt -, kann ich diese für die Standard-TextBox und fügen Sie keine Verhaltensweisen, die für alle textbox?
nehmen Sie einen Blick auf dieses Frage ALSO: stackoverflow.com/questions/1647815/...
Sehr schön. Nun brauche ich einen Weg, um Links und rechts funktionieren aber nur, wenn am Ende oder Anfang des Textes.
Ich bin mit einem keydown icommand zum hinzufügen eines neuen Elements zu der Liste. Sobald ich das Tue, möchte ich das neue Element, um das aktive (ausgewählte) Element. Ich denke, ich kann Sie einfach übergeben Sie die keyeventargs an meine Stellvertretung Befehl, aber gibt es eine Möglichkeit zum ersten ausführen meiner icommand, und dann das Verhalten auslösen, falls ich das?
InformationsquelleAutor Julien Poulin
Hinzufügen
PreviewKeyDown
EreignisTextBox
erste:Dann erstellen Sie eine
TraversalRequest
verschieben Sie den Fokus auf das nächste Element:BEARBEITEN
Alternativ, wenn Sie bevorzugen, verwenden Sie einen Befehl, können Sie stellen Sie einfach eine
KeyBinding
in IhremTextBox
:Und so ziemlich das gleiche wie oben in deinem ICommand
s
Ausführen " - Logik.Auch dieselbe Frage hier: Wie kann ich simulieren, eine Tab-Taste drücken, wenn Return gedrückt wird in eine WPF-Anwendung?
Eigentlich benutze ich MVVM Light, Bieten EventToCommand zu konvertieren Keydown-Ereignis auf Befehl. Aber mein problem ist, wie man den Fokus auf das Nächste Textfeld ohne Verwendung-Event-Handler.
Wieder, MVVM ist über die Trennung-Ansicht von logic. Es geht nicht um extremistische "keine Ereignisse erlaubt". Sie versuchen hier verschieben Sie den Fokus, das ist ein reines UI-Aktion, warum würden Sie es überall, aber in der UI (kann es sein, xaml oder xaml.cs) ? Stellen Sie sicher, zu erinnern, das erste: MVVM ist nicht etwa "keine code-behind" oder "keine Ereignisse", es geht um "kein Geschäft im UI-Logik". Sie sind vollständig berechtigt, zu verwenden, Ereignisse dort 🙂
Bitte werfen Sie einen Blick auf die Lösung oben von @Julien Poulin mit angeschlossenem Verhalten. Es ist sauber und es respektiert MVVM-Prinzip.
InformationsquelleAutor Damascus