繁体   English   中英

自 .NET 4.0 以来 XAML 绑定日期时间对象的自动更正行为?

[英]Auto correction behaviour on XAML bound datetime objects since .NET 4.0?

在将应用程序从 .NET 3.5 带到 .NET 4.0 时,我遇到了这个特殊问题。

(文化是 nl-BE)

我将这样的文本框(在 XAML 中)绑定到 DateTime 值,并在 PropertyChanged 上使用 UpdateSourceTrigger(LostFocus 按预期工作,但需要按您的类型进行验证):

<TextBox Height="23" Margin="146,0,105,97.04" Name="txb_Geboortedatum" VerticalAlignment="Bottom">
        <TextBox.Text>
            <Binding Path="Geboortedatum" StringFormat="d" 
                     UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <ExceptionValidationRule />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
</TextBox>

现在,当此文本框的内容为(例如)2000 年 10 月 12 日并且我想将其编辑为09/03/1981时,当我将cursor放在 2000 年底并开始“退格”时,会发生一些令人讨厌的自动更正' 去掉年份值(当只留下 '2000' 的第一个数字 ('2') 时,该值会自动 - 包括 cursor 跳转 - 再次变为 2002)。 我可以禁用此自动更正吗?

我似乎找不到具体介绍这种行为的原因。 对于货币值, FormatString=c也会出现同样的“问题”。

到目前为止我已经尝试过:

  1. 将 FormatString 更改为更明确的内容,例如{0}{dd/MM/yyyy} (同样的问题:当年份剩下 2 位数时开始自动更正)。
  2. 禁用我添加到我的 App.xaml.cs 的以下代码段:

     FrameworkElement.LanguageProperty.OverrideMetadata( typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage( CultureInfo.CurrentCulture.IetfLanguageTag)));

首先包含此代码段的原因: 查看此链接

我在这里遗漏了一些明显的东西吗? 我无法在 3.5 中重现这一点。 我真的必须推出自己的 ValueConverters 才能使其正常工作吗? 这看起来像是从 3.5 sp 1 中引入的StringFormat

来自DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns('d') Output 看起来确实略有不同,但没有什么可以立即解释这种行为(可能不相关):

.NET 3.5        .NET 4.0

d/MM/yyyy       d/MM/yyyy
d/MM/yy         d/MM/yy
dd-MM-yy        dd-MM-yy
dd.MM.yy        dd.MM.yy
yyyy-MM-dd      dd.MMM.yyyy
                yyyy-MM-dd

我现在最终使用了这样的东西,但我会对解决上述问题的其他方法非常感兴趣:

public class CustomDateTimeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          CultureInfo culture)
    {
        if (value == null) { return ""; }
        DateTime dt;
        if (DateTime.TryParse(value.ToString(), CultureInfo.CurrentCulture, 
                              DateTimeStyles.None, out dt))
        {
            return dt.ToShortDateString();
        }
        return "";
    }

    public object ConvertBack(object value, Type targettype, object parameter, 
                              CultureInfo culture)
    {
        if (value == null || value.ToString().Trim().Length==0) { return null; }
        string frmt = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
        DateTime dt;
        if (DateTime.TryParseExact(value.ToString(), frmt, 
                                   CultureInfo.CurrentCulture, 
                                   DateTimeStyles.None, out dt))
        {
            return dt;
        }
        return DependencyProperty.UnsetValue;
    }
}

好吧,如果您在 PropertyChanged 上自动更正,这种行为是“正常的”。 当您开始退格时,传递给 DateTime 构造函数的值是:

屏幕>>日期时间(' | '是每个退格之前的 cursor 位置)

10-12-2000| >> DateTime(200,12,10) >> 10-12-0200

10-12-020|0 >> DateTime(020,12,10) >> 10-12-020 

10-12-00|20  >> DateTime(020,12,10) >> 10-12-020 

10-12-0|20 >> DateTime(20,12,10) >> 10-12-2020

(由于yy-mm-dd字符串格式,我认为这可能会因您的文化而异)

很难,我不太明白为什么 new DateTime(20,12,10) 在文本框中为我提供 2020 年。 当我使用 DateTime.Parse(20,12,10) 它给我 2012-10-20 (yyyy-mm-dd)。 除非我们使用自定义 ValueConvertor,否则必须有某种我们无法控制的自动转换或解析

我认为自定义转换器是 go 如果你绝对需要'as-you-type validation'的好方法,否则 OnLostFocus 就像你说的那样工作得很好。

顺便说一句,我的文化是美国

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM