2010-02-09 20 views
5

Estoy vinculando un TextBox con una propiedad que es de tipo flotante. Todo funciona bien, cambio el valor en TextBox y se actualiza en la propiedad. El problema ocurre cuando hago el TextBox en blanco, mi propiedad no se actualiza, todavía tiene un valor anterior. Ahora necesito usar el convertidor en mi enlace para actualizar la propiedad con el valor predeterminado en el caso de un valor en blanco de TextBox. Quiero saber por qué este comportamiento? ¿Hay alguna otra solución para esto?Enlace de datos no se actualiza cuando TextBox está vacío

Respuesta

9

Su propiedad no se actualiza porque no es posible convertir una cadena vacía para flotar. Hay dos formas de resolver esto.

La primera forma es agregar una propiedad cuyo tipo es una cadena, unir el TextBox con ella e implementar el cambio de la propiedad float. De esta manera:

public partial class Window1 : Window, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public Window1() 
    { 
     InitializeComponent(); 
     // don't use this as DataContext, 
     // it's just an example 
     DataContext = this; 
    } 

    private float _FloatProperty; 
    public float FloatProperty 
    { 
     get { return _FloatProperty; } 
     set 
     { 
      _FloatProperty = value; 
      OnPropertyCahnged("FloatProperty"); 
     } 
    } 

    private string _StringProperty; 
    public string StringProperty 
    { 
     get { return _StringProperty; } 
     set 
     { 
      _StringProperty = value; 
      float newFloatValue; 

      // I think you want 0 when TextBox is empty, right? 
      FloatProperty = float.TryParse(_StringProperty, out newFloatValue) ? newFloatValue : 0; 

      OnPropertyCahnged("StringProperty"); 
     } 
    } 

    protected void OnPropertyCahnged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("StringProperty")); 
     } 
    } 
} 

La segunda manera es utilizar un convertidor:

namespace WpfApplication3 
{ 
    public partial class Window1 : Window, INotifyPropertyChanged 
    { 
     public static readonly IValueConverter TextBoxConverter = new FloatConverter(); 

     /* code from previous example without StringProperty */ 

    } 

    public class FloatConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return value.ToString(); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      float f; 
      if (value is string && float.TryParse(value as string, out f)) 
      { 
       return f; 
      } 

      return 0f; 
     } 
    } 
} 

XAML:

<Window x:Class="WpfApplication3.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WpfApplication3="clr-namespace:WpfApplication3"> 
    <Grid> 
     <TextBox Text="{Binding FloatProperty, Converter={x:Static WpfApplication3:Window1.TextBoxConverter}}" /> 
    </Grid> 
</Window> 

Hay an article about converters

Yo prefiero la primera forma con MVVM pattern.

+0

¡Ya entendí, gracias por la respuesta! – viky

0

Creo que el problema sería que el sistema de enlace coincida con un TextBox vacío. Para ti podría ser cero, pero para otra persona podría ser Single.NegativeInfinity.

7

acaba de cambiar el enlace como este

<TextBlock Text={Binding Path=Name, TargetNullValue='',UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}/> 
+0

¿Quién hace este trabajo, por ejemplo, ha establecido TargetNullValue en una cadena y no en un flotante? –

+1

Esto fue agregado en .3.5 sp1 aparentemente. No era consciente de eso hasta ahora. ¡Aclamaciones! – Daniel

+0

bien, guarde el compañero de trabajo gud –

Cuestiones relacionadas