2011-11-18 17 views
6

Estoy usando el TextBox de WPF con un enlace en la propiedad Text a un doble en mi ViewModel.Enlace a un doble con StringFormat en un TextBox

Mi XAML se ve así:

<TextBox Text="{Binding Path=MyDoubleValue, StringFormat=N2, UpdateSourceTrigger=PropertyChanged}" /> 

desgracia cuando cambio UpdateSourceTrigger a PropertyChanged y valor de tipo 12345, consigo 12,354.00 (EDITAR: notar el 5 antes de la 4). Esto es resultado de mantener el cursor en el mismo lugar después de agregar , entre 2 y 3 mediante el formateador .NET.

¿Cómo puedo usar StringFormat con UpdateSourceTrigger establecido en PropertyChanged?

Nota: Esto sólo ocurre en .NET 4.

+1

¿No es 12,345.00 lo que se espera al usar StrngFormat N2? ¿Qué esperas? – Jens

+0

Sí exactamente, pero en lugar de obtener eso tengo 12,354.00. – baalazamon

+0

La cadena de formato no hará que los dígitos cambien así, debe haber algo más en –

Respuesta

8

Por lo general, usted no quiere ser UpdateSourceTriggerPropertyChanged en un TextBox.Text vinculante porque esto desencadena la validación y notificación de cambio de cada vez que se pulsa una tecla.

Si está haciendo esto solo para que, si el usuario pulsa Enter, guardará el valor antes de procesar el comando de guardar, entonces sugeriría conectarlo al evento PreviewKeyDown y actualizar manualmente la fuente si la tecla presionada fuera Enter (Por lo general hacen de este un AttachedProperty)

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
     var obj = sender as UIElement; 
     BindingExpression textBinding = BindingOperations.GetBindingExpression(
      obj, TextBox.TextProperty); 

     if (textBinding != null) 
      textBinding.UpdateSource(); 
    } 
} 

pero dicho esto, si todavía quería utilizar UpdateSourceTrigger=PropertyChanged, entonces considerar el uso del formato cuando se muestra el valor, pero quitarla mientras el usuario está editando.

<TextBox> 
    <TextBox.Style> 
     <Style TargetType="{x:Type TextBox}"> 
      <Setter Property="Text" Value="{Binding Path=MyDoubleValue, StringFormat=N2}" /> 
      <Style.Triggers> 
       <Trigger Property="IsFocused" Value="True"> 
        <Setter Property="Text" Value="{Binding Path=MyDoubleValue, UpdateSourceTrigger=PropertyChanged}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 
+0

¿Tienes alguna idea de cómo lograr algo similar con los convertidores? La solución perfecta sería tener un convertidor que esté formateando solo si el control no está enfocado – baalazamon

+0

@baalazamon Podría crear un multi convertidor StringFormat que devuelva su 'value.ToString (convertidorParameter)' si el control 'IsFocused', sin embargo I Creo que DataTriggers es una mejor manera de ir en este caso – Rachel

+4

Por alguna razón, usando esta solución, si escribo "2.5" en un 'TextBox' en blanco obtengo" 25 ", el decimal no aparece. Si cambio el cursor a cualquier lugar excepto a la derecha, entonces puedo escribir decimales. – epalm

Cuestiones relacionadas