错误输入 - WPF后,文本框将有效值清空

时间:2017-03-19 12:06:06

标签: c# wpf validation mvvm data-binding

所以,我有一个包含文本框和标签的简单视图。

<TextBox x:Name="MyIntTextBox" Text="{Binding MyInt, UpdateSourceTrigger=LostFocus, Mode=TwoWay, StringFormat={}{D2}}"/>        
<Label Content="{Binding MyStr2}"/>

ViewModel,我有:

private decimal myInt;

public decimal MyInt
{
    get { return myInt; }
    set
    {
        if (value == myInt) { return; }
        myInt = value;               
        OnPropertyChange();
        OnPropertyChange("MyStr2");
    }
}

public string MyStr2
{
    get
    {
        return myInt.ToString("N2", CultureInfo.CreateSpecificCulture("en-IN"));
    }

}

简单来说,TextBox Text绑定到decimal值,而Label应该以{{1​​}}显示正确格式的值

由于textboxLostFocusUpdateSourceTrigger,我按TextBox以使TABvalidation有效。

因此,当我输入binding值时,一切正常。 decimal正确显示格式化的数字。

Properly working

当我输入一些垃圾非十进制值时,Label TextBox变为红色,表示验证错误。

error

但是,当我在那之后放一些有效值时,就像这样......

valid input

...然后专注于Border,bam! TextBox空白。

blank textbox

TextBox表示正确的值。我在Label中设置了断点,我可以看到ViewModel确实有正确的值,在本例中为600,但MyInt不会显示它。

我的TextBox窗口中也出现以下错误:

Output

这有什么简单的解决方法吗?或者这是我做错了什么?

2 个答案:

答案 0 :(得分:1)

  

但是,当我在那之后放一些有效值时,就像这样......

如果您在decimal中输入TextBox值,它将再次有效。

但是,解决方法是实现您自己的自定义转换器类,以处理decimalstring之间的转换。

试试这个:

namespace WpfApp2
{
    class DecimalToStringConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return null;

            return System.Convert.ToDecimal(value).ToString(parameter as string);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            decimal d;
            if (decimal.TryParse(value.ToString(), out d))
                return d;

            return value;
        }
    }
}
<StackPanel xmlns:local="clr-namespace:WpfApp2">
    <StackPanel.Resources>
        <local:DecimalToStringConverter x:Key="conv" />
    </StackPanel.Resources>
    <TextBox x:Name="MyIntTextBox" Text="{Binding MyInt, Converter={StaticResource conv}, ConverterParameter=0.00}"/>
    <Label Content="{Binding MyStr2}"/>
</StackPanel>

答案 1 :(得分:0)

mm8的解决方案很好,但是以可为空的小数点失败。 这是一个固定的ConvertBack函数:

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (decimal.TryParse(value.ToString(), out var d))
         return d;

    if (Nullable.GetUnderlyingType(targetType) != null)
        return null;
    else
        return 0m;
}