WinRT, Xaml, TextBox e selezione del testo
Ho cercato di riassumere lo scopo del post nel titolo, ma lo riassumo qui per maggiore chiarezza. Lo scopo è quello di scatenare il ‘seleziona tutto il testo’ quando una TextBox prende il focus. Chiaramente in ottica MVVM, quindi senza sporcare il code-behind della pagina. E’ uno dei comportamenti di default che più mi mancano, anche perchè sarebbe bastato aggiungere una proprietà AutoSelectAll nella TextBox e parecchi developer sarebbero stati più contenti.
Fortunatamente è piuttosto semplice scrivere una classe che raggiungere lo stesso risultato.
public static class TextBoxHelper { public static bool GetAutoSelectAll(DependencyObject obj) { return (bool)obj.GetValue(AutoSelectAllProperty); } public static void SetAutoSelectAll(DependencyObject obj, bool value) { obj.SetValue(AutoSelectAllProperty, value); } public static readonly DependencyProperty AutoSelectAllProperty = DependencyProperty.RegisterAttached("AutoSelectAll", typeof(bool), typeof(TextBoxHelper), new PropertyMetadata(null, new PropertyChangedCallback(Setup))); private static void Setup(DependencyObject obj, DependencyPropertyChangedEventArgs e) { TextBox tb = obj as TextBox; if (tb != null) { bool oldValue = (bool)e.OldValue; bool newValue = (bool)e.NewValue; if (oldValue == false && newValue == true) { tb.GotFocus += tb_GotFocus; } else if (oldValue == true && newValue == false) { tb.GotFocus -= tb_GotFocus; } } } static void tb_GotFocus(object sender, RoutedEventArgs e) { TextBox tb = sender as TextBox; if (tb != null) { tb.SelectAll(); } } }
Questa classe va ovviamente utilizzata nello XAML:
<TextBox common:TextBoxHelper.AutoSelectAll="True" />
Quando questa TextBox prende il focus, il testo in esso contenuto viene automaticamente selezionato grazie al behavior che gli abbiamo agganciato. Tutto questo direttamente nello XAML, senza code-behind, in perfetta sintonia con MVVM.