2010-02-09 3 views
5

Я привязываю TextBox к свойству типа float. Все работает отлично, я меняю значение в TextBox и оно обновляется в свойстве. Проблема возникает, когда я делаю TextBox пустым, мое свойство не обновляется, оно все еще имеет старое значение. Теперь мне нужно использовать конвертер в моей привязке для свойства update со значением по умолчанию в случае пустого значения из TextBox. Я хочу знать, почему это поведение? Есть ли другое решение?Data Binding не обновляется, когда TextBox пуст

ответ

9

Ваше имущество не обновляется, потому что это не возможно, чтобы преобразовать пустую строку плавать. Это можно решить двумя способами.

Первый способ - добавить свойство, которое является строкой, связать с ним текстовое поле и реализовать изменение свойства float. Как это:

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

Второй способ заключается в использовании конвертера:

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> 

Существует an article about converters

Я предпочитаю первый путь с MVVM pattern.

+0

Я получил вашу точку, спасибо за ответ !! – viky

0

Я думаю, проблема в том, что система привязки соответствует пустой TextBox. Для вас это может быть ноль, но для кого-то это может быть Single.NegativeInfinity.

7

просто изменить Binding как этот

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

Кто выполняет эту работу, например, вы установили TargetNullValue в строку, не являющуюся поплавком? –

+1

Это было добавлено в .net3.5 sp1, очевидно. Я до сих пор не знал об этом. Ура! – Daniel

+0

отлично, держите гуд работать приятель –

Смежные вопросы