请看下面这行代码。
<TextBox Text="{Binding Price}"/>
以上的Price属性是一个Decimal?
(可空的十进制数)。
我希望如果用户删除文本框的内容(即输入空字符串),它应该自动将数据源(绑定的目标)更新为null(在VB中为Nothing)。
有任何关于我如何在XAML中实现它的想法吗?
我正在使用.NET 3.5 SP1,所以很简单:
<TextBox Text="{Binding Price, TargetNullValue=''}"/>
这是由 Gregor 在评论中提供的缩写:
<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>
sys
是在 mscorlib
中导入 System
的 xml 命名空间:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
希望这有所帮助。
这个值转换器应该可以解决问题:
public class StringToNullableDecimalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
decimal? d = (decimal?)value;
if (d.HasValue)
return d.Value.ToString(culture);
else
return String.Empty;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
string s = (string)value;
if (String.IsNullOrEmpty(s))
return null;
else
return (decimal?)decimal.Parse(s, culture);
}
}
在资源中声明此转换器的一个实例:
<Window.Resources>
<local:StringToNullableDecimalConverter x:Key="nullDecimalConv"/>
</Window.Resources>
并将它用于绑定中:
<TextBox Text="{Binding Price, Converter={StaticResource nullDecimalConv}}"/>
请注意,TargetNullValue
在这里是不合适的:它用于定义当绑定的 source
为空时应使用哪个值。而在这里,Price
不是源,它是源的一个属性...
public class DoubleConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
return (double)value;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
var doubleValue = Convert.ToDouble(value);
return (doubleValue == 0 ? null : doubleValue);
}
}
(可能需要一些调整)