2013-10-29 12 views
7

Sto convalidando l'input dell'utente nel mio viewmodel e lanciando un messaggio di convalida nel caso in cui la convalida non abbia esito positivo per nessuno dei valori.Come impostare Focus su un controllo WPF usando MVVM?

Ho solo bisogno di impostare lo stato attivo sul particolare controllo per il quale la convalida è fallita.

Qualche idea su come raggiungere questo obiettivo?

+0

Concetto: crea un comportamento associato o un controllo personalizzato: dispone di una nuova proprietà di dipendenza che, se impostata su true, mette a fuoco tale controllo e lo imposta su false, quindi sei pronto per la prossima volta impostato su true. – bland

+1

Per l'input dell'utente, il controllo ha già lo stato attivo, giusto? Per i cambiamenti programmatici dei valori di controllo, in che modo si garantisce che un solo controllo non convalidi? Se più controlli fallirebbero la validazione, quale sarebbe il prescelto per focalizzarsi? – elgonzo

risposta

12

In genere, quando si vuole utilizzare un evento di interfaccia utente, nel rispetto della metodologia MVVM, creiamo un Attached Property:

public static DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached("IsFocused", typeof(bool), typeof(TextBoxProperties), new UIPropertyMetadata(false, OnIsFocusedChanged)); 

public static bool GetIsFocused(DependencyObject dependencyObject) 
{ 
    return (bool)dependencyObject.GetValue(IsFocusedProperty); 
} 

public static void SetIsFocused(DependencyObject dependencyObject, bool value) 
{ 
    dependencyObject.SetValue(IsFocusedProperty, value); 
} 

public static void OnIsFocusedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
{ 
    TextBox textBox = dependencyObject as TextBox; 
    bool newValue = (bool)dependencyPropertyChangedEventArgs.NewValue; 
    bool oldValue = (bool)dependencyPropertyChangedEventArgs.OldValue; 
    if (newValue && !oldValue && !textBox.IsFocused) textBox.Focus(); 
} 

Questa proprietà viene utilizzata in questo modo:

<TextBox Attached:TextBoxProperties.IsFocused="{Binding IsFocused}" ... /> 

allora possiamo focalizzare lo TextBox dal modello di visualizzazione cambiando la proprietà IsFocused a true:

IsFocused = false; // You may need to set it to false first if it is already true 
IsFocused = true; 
+1

Hai effettivamente fatto :) – Noctis

+2

@ Sheridan: come ti stai riferendo a typeof (TextBoxProperties)? Intendo lo spazio dei nomi richiesto per accedere a questo – user2519971

+0

Per una spiegazione completa, leggere la pagina [Panoramica delle proprietà allegate] (http://msdn.microsoft.com/en-us/library/ms749011.aspx) su MSDN ... per la breve spiegazione, questa è la classe in cui ho definito la proprietà in. "Allegato" è lo spazio dei nomi di quella classe. Questo è il motivo per cui si accede alla proprietà in questo modo: 'In allegato: TextBoxProperties.IsFocused'. – Sheridan