2012-09-05 22 views
5

En una aplicación WPF, estoy creando una ventana de configuración para personalizar los atajos de teclado.¿Cómo cambio TextBox.Text sin perder el enlace en WPF?

En los cuadros de texto, manejo el evento KeyDown y convierto el evento clave en un formulario legible por humanos (y también la forma en que quiero tener mis datos).

El cuadro de texto se declara como esto

<TextBox Text="{Binding ShortCutText, Mode=TwoWay}"/> 

y en el controlador de eventos, que trató de usar tanto

(sender as TextBox).Text = "..."; 

y

(sender as TextBox).Clear(); 
(sender as TextBox).AppendText("..."); 

En ambos casos, el la vinculación de nuevo al viewmodel no funciona, el viewmodel aún contiene los datos antiguos y no se actualiza. Encuadernación en la otra dirección (desde el modelo de vista hasta el cuadro de texto) funciona bien.

¿Hay alguna manera de editar el TextBox.Text del código sin usar el enlace? ¿O hay algún otro error en mi proceso?

+3

Idealmente, debe actualizar este valor en su modelo, que reflejará automáticamente los cambios en los cuadros de texto, ya que está utilizando MVVM. – Deepesh

+1

Trate de agregar 'UpdateSourceTrigger = PropertyChanged' a su enlace –

+0

Sé que esta es una vieja pregunta por ahora, pero una cosa que las personas parecen ignorar aquí es si usted tiene una propiedad de control vinculada a otro control (Diga una lista de casillas de verificación que están todos marcados o desmarcados por una casilla de verificación principal). Puede que no haya nada en la VM que lo ayude aquí. –

Respuesta

8
var box = sender as TextBox; 
// Change your box text.. 

box.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

Esto debería obligar a su enlace a actualizar.

+0

Al usar UpdateTarget(), en realidad no actualiza en absoluto, incluso el cuadro de texto conserva el valor anterior. –

+0

Algunas respuestas que aún requieren pensar ... viendo que usaste el mismo código que yo, excepto que no ajusté el texto entre medio ... ¿Considero que esta es la respuesta correcta? – KyorCode

+0

Le di un +1 porque usted es el único que ayudó. –

3

No cambie la propiedad de texto - cambie a lo que está vinculando.

+0

¿Por qué debería el cuadro de texto tener una referencia al propio modelo de vista? No quiero hacer ningún tipo de conversión a mi tipo específico, por eso utilicé el enlace bidireccional. –

+0

No debería. No haga referencia al cuadro de texto. tiene que actualizar el texto, no debe saber sobre el cuadro de texto. –

+0

en serio? Es un controlador de eventos "TextBoxInput (remitente de objeto, KeyEventArgs e)" –

1

Esto hizo el truco:

private static void SetText(TextBox textBox, string text) 
    { 
     textBox.Clear(); 
     textBox.AppendText(text); 
     textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
    } 
0

Usted don `t necesidad de modificar el valor del cuadro de texto en absoluto! En el código solo necesita modificar su valor relacionado (ShortCutText) También puede establecer IsReadOnly = "True" propiedad de su TextBox.

<TextBox Text="{Binding Path=ShortCutText,Mode=OneWay}" 
     KeyDown="TextBox_KeyDown" IsReadOnly="True"/> 

Debe darse cuenta INotifyPropertyChanged interfaz en su clase como se describe en MSDN:

http://msdn.microsoft.com/library/system.componentmodel.inotifypropertychanged.aspx

Modificar colocador de su ShortCutText propiedad (al que su cuadro de texto está obligado a) :

class MyClass:INotifyPropertyChanged 
{ 
    string shortCutText="Alt+A"; 
    public string ShortCutText 
    { 
     get { return shortCutText; } 
     set 
      { 
        shortCutText=value; 
        NotifyPropertyChanged("ShortCutText"); 
      } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    void NotifyPropertyChanged(string props) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this , new PropertyChangedEventArgs(prop)); 
    } 

} 

WPF se suscribirá automáticamente al evento PropertyChanged. Ahora utilizar KeyDown caso de cuadro de texto, por ejemplo, así:

private void TextBox_KeyDown(object sender , KeyEventArgs e) 
{ 
    ShortCutText = 
     (e.KeyboardDevice.IsKeyDown(Key.LeftCtrl)? "Ctrl+ " : "") 
     + e.Key.ToString(); 
} 
1

Tengo caso similar.

Cuando borro el cuadro de texto esta perdiendo el enlace.

que llevaban: textbox1.Text = String.empty

cambio para esto: textbox1.Clear()

Y este es el punto de mi solución

0

Si está usando MVVM no se debe cambiar la propiedad de texto del cuadro de texto de código , cambie el valor en el modelo de vista y el patrón hará su trabajo sincronizando la vista.

Cuestiones relacionadas