visual texto tamaño qué que poner net informatica como caracteristicas cambiar asp textbox binding multibinding propertychanged updatesourcetrigger

tamaño - El texto en TextBox con UpdateSourceTrigger=PropertyChanged no se actualiza cuando la coerción de entrada de texto da como resultado un valor fuente sin modificar



textbox textchanged c# asp net (1)

Tengo un cuadro de texto cuya propiedad Text tiene un enlace múltiple de TwoWay con UpdateSourceTrigger establecido en PropertyChanged . El primer enlace es a una propiedad de dependencia ( Valor ) que tiene una función PropertyChangedCallBack que redondea el valor a un lugar decimal.

El objetivo del cuadro de texto es realizar el redondeo a medida que el usuario escribe en lugar de cuando el cuadro de texto pierde el foco, por lo que UpdateSourceTrigger se establece en PropertyChanged .

El problema que estoy teniendo es que si se ingresa texto que NO da como resultado el cambio de valor , la propiedad de Texto y el valor no se sincronizan. Solo si la operación de redondeo hace que el valor cambie, el texto se actualiza al vuelo. Por ejemplo, si Texto y Valor son ambos 123.4 y el usuario escribe 1 después de esto, el Valor se redondea al mismo valor (123.4), pero el Texto muestra 123.41. Sin embargo, si se escribe 9 después de 4, el valor se redondea a 123.5. Y debido a este cambio real, el texto se actualiza a la misma (123.5).

¿Hay alguna forma de forzar un cuadro de texto para actualizar desde su origen, incluso cuando la fuente no ha cambiado desde el último desencadenador? He intentado usar BindingExpressionBase.UpdateTarget() pero esto solo funciona cuando UpdateSourceTrigger está establecido en Explicit , que no se puede usar como Value ya no se actualiza antes de un momento adecuado en el que se podría invocar UpdateTarget (como un controlador TextInput ). He intentado con otros métodos, como actualizar explícitamente el valor de Texto del Valor encuadernado, forzando un cambio real a Valor temporalmente para invocar una actualización, pero estos "cortes" no funcionan o causan otros problemas.

Cualquier ayuda sería muy apreciada.

El código está abajo.

Fragmento XAML

<TextBox> <TextBox.Text> <MultiBinding Converter="{local:NumberFormatConverter}" UpdateSourceTrigger="Explicit" Mode="TwoWay"> <Binding Path="Value" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" Mode="TwoWay" /> </MultiBinding> </TextBox.Text> </TextBox>

Fragmento de C #

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register( "Value", typeof(decimal), typeof(MainWindow), new FrameworkPropertyMetadata(0m, new PropertyChangedCallback(OnValueChanged))); private static void OnValueChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { obj.SetValue(ValueProperty, Math.Round((decimal)args.NewValue, 1)); }

Requiere clase de conversión

public class NumberFormatConverter : MarkupExtension, IMultiValueConverter { public static NumberFormatConverter Instance { private set; get; } static NumberFormatConverter() { Instance = new NumberFormatConverter(); } public override object ProvideValue(IServiceProvider serviceProvider_) { return Instance; } #region Implementation of IMultiValueConverter public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { return values[0].ToString(); } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { var result = 0m; if (value != null) { decimal.TryParse(value.ToString(), out result); } return new object[] { result }; } #endregion }


Hice un poco de búsqueda en Internet, y resulta que esto se rompió en WPF 4. Alguien con un problema casi idéntico para mí publicado aquí: http://www.go4answers.com/Example/textbox-shows-old- value-being-coerced-137799.aspx

''Answer 8'' indica que esto estaba roto en WPF 4 y sugiere una solución, que es utilizar UpdateSourceTrigger="Explicit" pero para manejar el evento TextChanged y llamar a BindingExpression.UpdateSource () para forzar cambios en el cuadro de texto para que se reflejen en el valor subyacente como si UpdateSourceTrigger="PropertyChanged" , según esta publicación: Coerce un WPF TextBox que ya no funciona en .NET 4.0

Implementé esto, pero he aquí que hubo más efectos secundarios, en particular que cada pulsación de tecla hizo que el cursor saltara al principio del cuadro de texto debido a la actualización de la fuente y al generar un evento PropertyChanged . Y también, cualquier cero inicial o posterior o lugares decimales ingresados ​​con la intención de ingresar dígitos adicionales serían aniquilados inmediatamente. Entonces, una condición simple para verificar el valor decimal analizado del cuadro de texto versus el valor subyacente lo resolvió.

El siguiente controlador de eventos es todo lo que se necesitaba:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { var tb = (TextBox)e.Source; MultiBindingExpression binding = BindingOperations.GetMultiBindingExpression(tb, TextBox.TextProperty); decimal result = 0m; decimal.TryParse(tb.Text, out result); if ((decimal)GetValue(ValueProperty) != result && binding != null) { int caretIndex = tb.CaretIndex; binding.UpdateSource(); tb.CaretIndex = caretIndex; } }