代码之家  ›  专栏  ›  技术社区  ›  viky

文本框为空时数据绑定不更新

  •  5
  • viky  · 技术社区  · 15 年前

    我正在用float类型的属性绑定文本框。一切正常,我更改文本框中的值,它在属性中得到更新。当我将文本框设为空白、我的属性未更新、它仍具有旧值时,就会出现问题。现在,我需要在绑定中使用converter来更新具有默认值的属性,以防文本框中出现空值。我想知道为什么这种行为?还有其他解决办法吗?

    3 回复  |  直到 12 年前
        1
  •  9
  •   bniwredyc    15 年前

    您的属性未更新,因为无法将空字符串转换为float。有两种方法可以解决这个问题。

    第一种方法是添加一个类型为string的属性,用它绑定文本框并实现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 .

        2
  •  7
  •   Kishore Kumar    15 年前

    像这样改变装订

    <TextBlock Text={Binding Path=Name, TargetNullValue='',UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}/>
    
        3
  •  0
  •   serialhobbyist    15 年前

    我认为问题在于绑定系统与空文本框的匹配程度。对你来说可能是零,但对其他人来说可能是单一的,消极的。