0

我有一个绑定到一些十进制值的文本框。现在,如果我在其中输入 100 之类的内容并将其完全清除(空)。我保存数据,它以十进制值保存 1。同样,如果我尝试 200 并清除文本框,它会节省 2。记住十进制值不为空。有任何想法吗?

<TextBox 
    Height="23" 
    VerticalAlignment="Center" 
    Text="{Binding Discount,Mode=TwoWay}" 
    MaxLength="50" 
    TabIndex="28" 
    Grid.Row="2" 
    Grid.Column="1" 
    local:FocusExtension.IsFocused=
        "{Binding Path=IsDiscountFocused,Mode=TwoWay}" 
    Margin="5,0,0,0"/>
4

2 回答 2

4

由于默认情况下 String.Empty 不能转换为小数。最后一个有效值保存在属性中。您应该使用如下转换器。

WPF

<Window.Resources>
    <local:ValueConverter x:Key="valueConverter" />
</Window.Resources>

<TextBox Text="{Binding Path=Value, Mode=TwoWay, Converter={StaticResource valueConverter}}" />

转换器:

public class ValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is string && (string)value == "")
        {
            return 0;
        }

        return value;
    }
}

清除:

public decimal Value
{
    get { return (decimal)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}
于 2012-11-15T08:39:28.393 回答
0

我假设您的视图模型中的 Discount 属性如下所示:

public decimal Discount {get;set;}

如果你使用退格键并清除你的文本框,你会得到一个绑定异常,因为“”不能转换为十进制。所以最后一个数字保留在您的财产中。实际上这应该在使用 UpdateSourceTrigger=Propertychanged 时发生。但是您可以尝试使用十进制吗?如果这没有帮助,您还可以添加一个转换器以将“”转换为您的视图模型可以处理的值。

编辑:我没有看到你最后的评论。但如果您想要一个空文本框为 0,则只需在“”为输入时使用转换器返回 0。

于 2012-11-15T08:19:41.170 回答