Domanda

Ho una semplice Converter che aggiunge un simbolo "+" ad un numero positivo che viene inserito in un TextBox. Quando viene inserito il numero che voglio avviare qualche azione, ma io non voglio aspettare fino a quando il TextBox perde il fuoco:. Voglio aggiornare il legame immediatamente come l'utente immette il testo

Il comportamento predefinito di un TextBox è che quando un utente si sposta lontano dalla scatola, la sorgente di legame viene aggiornato (UpdateSourceTrigger = LostFocus). In questo scenario, il mio convertitore funziona come previsto, e si aggiunge il +. Tuttavia, quando lo cambio a quanto segue, il + è non ha aggiunto.

<TextBox Text="{Binding Value, Converter={StaticResource PlusConverter}, UpdateSourceTrigger=PropertyChanged}" />

Posso immaginare che ci sia una buona ragione per cui il mio metodo converter.Convert () non viene chiamato. Mi piacerebbe avere il seguente comportamento:

  1. Quando gli utenti immette del testo, la fonte viene aggiornata immediatamente
  2. Quando il TextBox perde messa a fuoco, si aggiunge il +.

Ora sto cercando un modo piacevole, ma soprattutto GENERICO di fare questo (come ho un sacco di queste caselle di testo nella mia app). Finora non sono stato in grado di trovare una soluzione adeguata.

È stato utile?

Soluzione 3

Grazie per le vostre risposte! Ho guardato in questo problema io stesso un po 's'affacciava e si avvicinò con la seguente soluzione (che io non sono del tutto soddisfatto, ma funziona bene)

Ho creato un CustomControl che aggiunge funzionalità al TextBox.

E 'previsto un gestore di eventi per l'evento LostFocus Quando si verifica questo evento, il mio convertitore si chiama.

Tuttavia, il mio modo di risolvere il convertitore non è molto soddisfacente (lo prendo dal stile che è associato con la mia TextBox). Lo stile ha un Setter per la proprietà Text. Da quel setter posso accedere al mio Converter.

Certo che potrebbe anche fare un "PlusTextBox", ma io uso convertitori diversi e ho voluto una soluzione generica.

public class TextBoxEx : TextBox
{
    public TextBoxEx()
    {
        AddHandler(LostFocusEvent,
          new RoutedEventHandler(CallConverter), true);
    }

    public Type SourceType
    {
        get { return (Type)GetValue(SourceTypeProperty); }
        set { SetValue(SourceTypeProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SourceType.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SourceTypeProperty =
        DependencyProperty.Register("SourceType", typeof(Type), typeof(TextBoxEx), new UIPropertyMetadata(null));

    private static void CallConverter(object sender, RoutedEventArgs e)
    {
        TextBoxEx textBoxEx = sender as TextBoxEx;
        if (textBoxEx.Style == null) {
            return;
        }
        if (textBoxEx.SourceType == null) {
        }
        foreach (Setter setter in textBoxEx.Style.Setters) {
            if (setter.Property.ToString() == "Text") {
                if (! (setter.Value is Binding) ) {
                    return;
                }
                Binding binding = setter.Value as Binding;
                if (binding.Converter == null) {
                    return;
                }
                object value = binding.Converter.ConvertBack(textBoxEx.Text, textBoxEx.SourceType, binding.ConverterParameter, System.Globalization.CultureInfo.CurrentCulture);
                value = binding.Converter.Convert(value, typeof(string), binding.ConverterParameter, System.Globalization.CultureInfo.CurrentCulture);
                if (!(value is string)) {
                    return;
                }
                textBoxEx.Text = (string)value;
            }
        }
    }
}

Altri suggerimenti

Sono d'accordo w / Kent B, è necessario inserire il codice Converter.

Sono stato in grado di ottenere una parte 1 di lavorare con un semplice convertitore (sto vincolante un secondo TextBlock non convertito per indicare che il valore è infatti sempre aggiornato).

Tuttavia, se ho ben capito la tua parte 2, si sta cercando di ottenere il TextBox Testo s 'per aggiornare con un '+' dopo che perde lo stato attivo. Questo è un po 'più complicato e non credo che sarete in grado di farlo con un semplice iConverter. Se si può fare, mi piacerebbe conoscere la risposta pure.

Quello che stai chiedendo in sostanza è un comportamento di ingresso filigranata per esempio consentire a un utente di inserire alcuni dati, e hanno di venire formattata correttamente (sia nel DataBinding sottostante e l'interfaccia utente). Il / soluzione più rapida più sporca a questo è quello di gestire LostFocus le caselle di testo, ma dal momento che si sta utilizzando che in tutto la vostra applicazione, questo potrebbe non essere fattibile.

Si potrebbe anche considerare avvolgendo il TextBox nel proprio UserControl. Se si guarda alla implementazione di WPFToolkit di un DatePicker ha un comportamento simile:. Permettono all'utente di inserire testo in forma libera, quindi auto-convertire il valore a un DateTime (se valido) e mostrare il DateTime in un formato localizzato

HTH.

L'altra cosa che si potrebbe desiderare di fare, è modificare il modello per il controllo TextBox e spostare il PART_ContentHost reale a destra un po ', poi hanno un TextBlock indica la parte +/-; vale a dire cambiare il template del controllo TextBox da:

Control
- Border
-- PART_ContentHost (the actual editing part)

in:

Control
- Border
-- Horizontal StackPanel
--- TextBlock (contains +/- sign, has 2px right margin)
--- PART_ContentHost (actual editable section)

Poi, legano il contenuto del TextBlock al testo, ma con un convertitore che o scrive un '+' o '-'. In questo modo, l'utente non può eliminare il +/- parte, e non devi preoccuparti di analizzarlo; questo rende anche più facile se si vuole fare qualcosa di simile a fare il segno negativo rosso o qualcosa del genere.

Nel vostro convertitore, potrebbe non solo controllare fuoco corrente della tastiera? Qualcosa di simile:

TextBox focusedTextBox = Keyboard.FocusedElement as TextBox;
if (focusedTextBox == null || focusedTextBox != senderOrWhatever)
{
 ' this is where you'd add the +, because the textbox doesn't have focus.
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top