当文本框为空时,数据绑定不会更新。

5

我正在将一个类型为float的属性与一个文本框绑定。一切都很好,我改变了文本框中的值,它会更新到属性中。当我将文本框清空时,问题出现了,我的属性没有更新,仍然保持旧值。现在我需要在绑定中使用转换器,在文本框为空时使用默认值来更新属性。我想知道这种行为的原因是什么?是否有其他解决方案?

3个回答

9
您的属性未更新,因为无法将空字符串转换为浮点数。有两种解决方法。
第一种方法是添加一个类型为字符串的属性,将TextBox与其绑定,并实现浮点属性的更改。如下所示:
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>

这里有一篇关于转换器的文章

我更喜欢使用MVVM模式的第一种方式。


7
只需像这样更改绑定即可。
<TextBlock Text={Binding Path=Name, TargetNullValue='',UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}/>

谁做这项工作,比如说你把 TargetNullValue 设置成了字符串而不是浮点型? - Ian Ringrose
1
显然,这是在.NET 3.5 SP1中添加的。直到现在我才知道。干杯! - Daniel

0

我认为问题在于绑定系统如何匹配空的文本框。对于你来说,它可能是零,但对于其他人来说,它可能是Single.NegativeInfinity。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接