.net 数据绑定没有';文本框为空时不更新
我正在用float类型的属性绑定一个文本框。一切正常,我更改了TextBox中的值,它在属性中得到更新。当我将文本框设置为空时,问题就出现了,我的属性没有更新,它仍然具有旧值。现在,我需要在绑定中使用转换器,以在TextBox中出现空值时使用默认值更新属性。我想知道为什么会有这种行为?还有其他解决方案吗?我认为问题在于绑定系统与空文本框的匹配。对你来说,它可能是零,但对其他人来说,它可能是单一的。NegativeInfinity。只需像这样更改绑定即可.net 数据绑定没有';文本框为空时不更新,.net,wpf,data-binding,properties,string,.net,Wpf,Data Binding,Properties,String,我正在用float类型的属性绑定一个文本框。一切正常,我更改了TextBox中的值,它在属性中得到更新。当我将文本框设置为空时,问题就出现了,我的属性没有更新,它仍然具有旧值。现在,我需要在绑定中使用转换器,以在TextBox中出现空值时使用默认值更新属性。我想知道为什么会有这种行为?还有其他解决方案吗?我认为问题在于绑定系统与空文本框的匹配。对你来说,它可能是零,但对其他人来说,它可能是单一的。NegativeInfinity。只需像这样更改绑定即可 <TextBlock Text={B
<TextBlock Text={Binding Path=Name, TargetNullValue='',UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}/>
您的属性未更新,因为无法将空字符串转换为浮点值。有两种方法可以解决这个问题 第一种方法是添加一个类型为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:
有
我更喜欢第一种方法。谁做这项工作,例如您将TargetNullValue设置为字符串而不是浮点值?这显然是在.net3.5 sp1中添加的。直到现在我才意识到。干杯
<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>