DataContext属性绑定到TextBox.Text没有';t在清除TextBox时更新

本文关键字:TextBox 清除 更新 绑定 属性 Text 没有 DataContext | 更新日期: 2023-09-27 18:28:01

在我的SilverLight应用程序中,我有一个绑定到DataContextnullable decimalTextBox.Text。例如,当我将TextBox的值从25更改为6时,它起作用,会执行DataContext上的属性setter并更新后备字段,但当我手动清除TextBox时,它不起作用,不会调用setter。

[DataMember]
public decimal? Order 
{
    get { return order; }
    set { order = value; }
}
decimal? order;

xaml片段:

<Input:PraTextBox
    Text="{Binding Path=Order, Mode=TwoWay}"
    IsEnabled="{Binding Path=IsDefaultVisibleEnabled, Mode=TwoWay}"/>

DataContext属性绑定到TextBox.Text没有';t在清除TextBox时更新

一个普通的TextBox默认情况下只更新LostFocus上的绑定源。我不知道你的PraTextBox是干什么的。但我建议您检查它是在LostFocus还是在PropertyChanged上更新源。

尝试在绑定中指定UpdateSourceTrigger:

Text="{Binding Path=Order, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

下一次尝试:使用转换器:

public class NullableDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
        CultureInfo culture) { return value; }
    public object ConvertBack(object value, Type targetType, object parameter,
        CultureInfo culture)
    {
        string decimalString = value as string;
        decimal parsedDecimal;
        if (decimalString != null && Decimal.TryParse( decimalString,
                                                       out parsedDecimal ))
            return parsedDecimal;
        else
            return null;
    }
}

绑定:

Text="{Binding Path=Order, Mode=TwoWay,
    Converter={StaticResource myNullableDecimalConverter}}"

显然Silverlight(据我所知,还有WPF)将空的TextBox视为空字符串,而不是null。。此外,他们认为空字符串转换为数字是不确定的,因此,如果将数字绑定到文本框,一旦将值设置为数字,就无法再清除它。

PropertyChanged不会因为数字没有改变而触发-获取调试器并亲自查看。

在Silverlight 5中,您可以使用以下内容:

<TextBox Text="{Binding SOMEFIELD, Mode=TwoWay, TargetNullValue=''}"

其中SOMEFIELD是Nullable或其他数字。。