在WPF绑定中将值设置为null


116

请看下面的一行

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

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

我希望如果用户删除文本框的内容(即输入空字符串,则应使用null(在VB中为Nothing)自动更新源。

关于“ Xamly”如何做的任何想法?

Answers:


226

我正在使用.NET 3.5 SP1,因此非常简单:

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

代表(感谢Gregor的评论):

<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>

sys对于进口的XML命名空间Systemmscorlib

xmlns:sys="clr-namespace:System;assembly=mscorlib"

希望能有所帮助。


13
实际上TargetNullValue可以正常工作。它的作用是在给定值和null之间设置一个等效项。因此,在这种情况下,当绑定值为null时,它将显示一个空字符串,而当目标值为空字符串时,它将绑定值设置为null。
布赖恩·安德森

4
TargetNullValue有效。使用值转换器时,我得到了相同的结果。您还可以简化表达式:<TextBox Text =“ {Binding Price,TargetNullValue =”''}“ />
Gregor Slavec 2011年

2
我很困惑-OP说:“ ..它应该以空值自动更新源(当Target为空字符串时)。”,但是TargetNullValue更新Target而不是Source
markmnl

1
您不是唯一一个困惑的人-其他答案也有困惑的评论。OP也有些困惑,当他说更新源代码时,他实际上是指WPF中的目标说话(源代码是TextBox上的Text属性)。TargetNullValue表示当Target为null时将Source设置为什么值。相反,我们在这里利用的是,当源更新为该指定值时,目标将设置为null。
内森·菲利普斯

@markmnl虽然TargetNullValue实际上旨在更新Target而不是更新Source,但由于某些原因(我不太清楚为什么),此解决方案仍然可以解决问题。
Tim Pohlmann

12

这个值转换器应该可以解决这个问题:

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绑定的null为空时应使用哪个值。这Price不是来源,而是来源的属性...


2
转换器是执行此操作的正确方法,您不能在XAML中定义这些转换器。转换器允许您更改数据绑定中默认的“对象到对象”转换行为,这就是您想要做的。
Will Eddins

在我的情况下,问题在于我已经在这里使用了做另一件事的转换器。我发布了答案,请看看。
Shimmy Weitzhandler,2009年

可能想使用IsNullOrWhiteSpace()允许将“”计为null(最有可能是您想要的)
Simon_Weaver

+1但是:价格是您的来源,但您是正确的TargetNullValue在这里不合适-TargetNullValue 在来源为空时设置目标 -而我们希望在目标为某个值(空值)时将来源设置为null字符串)-转换器执行的操作。
markmnl

5

您可以尝试使用ValueConverter(IValueConverter) http://msdn.microsoft.com/zh-cn/library/system.windows.data.ivalueconverter.aspx

在我的脑后,类似:

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

(尽管可能需要一些调整)


我希望使用Xamly的方式,但我什么也没想到
Shimmy Weitzhandler 2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.