在WPF绑定中将值设置为null

在WPF绑定中将值设置为null,wpf,nullable,binding,.net-3.5,string,Wpf,Nullable,Binding,.net 3.5,String,请看下面一行 <TextBox Text="{Binding Price}"/> 上面的这个Price属性是一个十进制数?(可为空的十进制数) 我希望,如果用户删除文本框的内容(即输入空字符串),它应该自动用null更新源(VB中没有) 有没有关于如何“完美”完成的想法?您可以尝试使用ValueConverter(IValueConverter) 在我的后脑勺,像: public class DoubleConverter : IValueConverter { pu

请看下面一行

<TextBox Text="{Binding Price}"/>

上面的这个Price属性是一个
十进制数?
(可为空的十进制数)

我希望,如果用户删除文本框的内容(即输入空字符串),它应该自动用null更新源(VB中没有)


有没有关于如何“完美”完成的想法?

您可以尝试使用ValueConverter(IValueConverter)

在我的后脑勺,像:

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

(可能需要一些调整)

此值转换器应该可以实现以下功能:

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);
    }
}
在Resources中声明此转换器的实例:

<Window.Resources>
    <local:StringToNullableDecimalConverter x:Key="nullDecimalConv"/>
</Window.Resources>

并在您的绑定中使用它:

<TextBox Text="{Binding Price, Converter={StaticResource nullDecimalConv}}"/>


请注意,
TargetNullValue
在这里不合适:它用于定义绑定的
source
为null时应该使用哪个值。这里
Price
不是源,而是源的属性…

我使用的是.NET 3.5 SP1,所以它非常简单:

<TextBox Text="{Binding Price, TargetNullValue=''}"/>

希望有帮助。

我更喜欢Xamly方式,但我想不出任何东西转换器是实现这一点的正确方式,而且您不能在XAML中定义这些转换器。转换器允许您更改默认的“对象到对象”数据绑定中的转换行为,这正是您想要做的。在我的例子中,问题是我已经在这里使用了一个Converter来做另一件事。我发布了一个答案,请看一看。可能需要使用IsNullOrWhiteSpace()来允许“”计为null(很可能是您想要的)+1但是:Price在这里是您的源,但您是正确的TargetNullValue在这里不合适-TargetNullValue在源为null时设置目标-而我们希望在目标为特定值(空字符串)时设置源(为null)-这是你的转换器所做的。实际上TargetNullValue工作得很好。它所做的是在给定值和null之间设置一个等价项。因此,在这种情况下,当绑定值为null时,它将显示一个空字符串,当目标值为空字符串时,它将绑定值设置为null。TargetNullValue工作。我得到的结果与您还可以简化表达式:I'm Middle-OP说:“…它应该自动用null更新源[当目标是空字符串时]。”,但TargetNullValue更新的是目标,而不是源!你不是唯一一个困惑的人-另一个答案上也有困惑的评论。OP也有点困惑,当他说更新源时,他实际上是指WPF speak中的目标(源是TextBox上的Text属性).TargetNullValue表示当目标为空时,将源设置为什么值。与此相反的是,当源更新为此指定值时,目标将设置为空。@markmnl而TargetNullValue确实旨在更新
目标
,而不是
Source
,出于某种原因(我不太明白为什么),这个解决方案仍然能奏效。
<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>
xmlns:sys="clr-namespace:System;assembly=mscorlib"