Is there a way to set Focus
from one control to another using WPF Trigger
s?
Like the following example:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <TextBox Name="txtName"></TextBox> <TextBox Grid.Row="1" Name="txtAddress"></TextBox> <Button Grid.Row="2" Content="Finish"> <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <!-- Insert cool code here--> </EventTrigger> </Button.Triggers> </Button> </Grid> </Page>
Is there a way for this EventTrigger
to put to focus on the textBox "txtName"?
I am trying to find the way to do something like this using strict MVVM. If this is something that should not be done via the XAML (in MVVM) then that is fine. But I would like to see some kind of documentation as to how it fit in the MVVM pattern doing it outside the XAML.
Have you considered using an attached behaviour. They are simple to implement and use AttachedProperty's. Although it still requires code, this code is abstracted away in a class and be reused. They can eliminate the need 'code behind' and are often used with the MVVM pattern.
Try this one and see if it works for you.
public class EventFocusAttachment { public static Control GetElementToFocus(Button button) { return (Control)button.GetValue(ElementToFocusProperty); } public static void SetElementToFocus(Button button, Control value) { button.SetValue(ElementToFocusProperty, value); } public static readonly DependencyProperty ElementToFocusProperty = DependencyProperty.RegisterAttached("ElementToFocus", typeof(Control), typeof(EventFocusAttachment), new UIPropertyMetadata(null, ElementToFocusPropertyChanged)); public static void ElementToFocusPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var button = sender as Button; if (button != null) { button.Click += (s, args) => { Control control = GetElementToFocus(button); if (control != null) { control.Focus(); } }; } } }
And then in your XAML do something like...
<Button Content="Click Me!" local:EventFocusAttachment.ElementToFocus="{Binding ElementName=textBox}" /> <TextBox x:Name="textBox" />
I'm not near visual studio so I can't actually try this right now, but off the top of my head, you should be able to do something like this:
FocusManager.FocusedElement="{Binding ElementName=txtName}">
Edit:
There is a followup question (asked more recently) about this here: How to set autofocus only in xaml? which contains this method, and a few different ideas on how to use it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With