2010-02-09 8 views
5

Jestem powiązanie TextBox z właściwością, która jest typu float. Wszystko działa dobrze, zmieniam wartość w TextBox i aktualizuje się w nieruchomości. Problem występuje, gdy pole tekstowe jest puste, moja właściwość nie jest aktualizowana, nadal ma starą wartość. Teraz muszę użyć konwertera w moim powiązaniu, aby zaktualizować właściwość z wartością domyślną w przypadku pustej wartości z TextBox. Chcę wiedzieć Dlaczego to zachowanie? Czy jest jakieś inne rozwiązanie tego?Powiązanie danych nie aktualizuje się, gdy pusta ramka TextBox jest

Odpowiedz

9

Twoja nieruchomość nie jest aktualizacją, ponieważ nie jest możliwe do konwersji pusty ciąg do pływaka. Istnieją dwa sposoby rozwiązania tego problemu.

Pierwszym sposobem jest dodanie właściwości, której typem jest ciąg, powiązanie z nią TextBox i zaimplementowanie zmiany właściwości float. Tak:

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")); 
     } 
    } 
} 

Drugim sposobem jest użycie konwertera:

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> 

Jest an article about converters

wolę pierwszy sposób z MVVM pattern.

+0

Dostałem twój punkt, dzięki za odpowiedź !! – viky

0

Myślę, że problem byłby związany z tym, jaki system wiążący pasuje do pustego pola tekstowego. Dla ciebie może to być zero, ale dla kogoś innego może to być Single.NegativeInfinity.

7

prostu zmienić Binding jak ten

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

kto to działa, np. Ustawiono TargetNullValue na ciąg, a nie na float? –

+1

Zostało to dodane w .net3.5 sp1 podobno. Nie wiedziałem o tym aż do teraz. Twoje zdrowie! – Daniel

+0

w porządku, zachowaj kumpelkę pracy –

Powiązane problemy