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

问题描述

| 在将应用程序从.NET 3.5引入.NET 4.0时,我遇到了这个特殊问题。 (文化是nl-BE) 我用PropertyChanged上的UpdateSourceTrigger将这样的文本框(在XAML中)绑定到DateTime值(LostFocus可以按预期方式工作,但需要您进行键入验证):
<TextBox Height=\"23\" Margin=\"146,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年12月12日时,我想将其编辑为1981年3月9日,当我将光标放在2000年末并开始\'时,会发生一些令人讨厌的自动更正。将年份值后退\(仅当\'2000 \'的第一位数字(\'2 \')保留时,该值自动-包括光标跳转-再次变为2002)。我可以禁用此自动校正吗? 我似乎找不到专门介绍此行为的内容。货币值
FormatString=c
也会出现相同的“问题”。 到目前为止,我已经尝试过: 将FormatString更改为更明确的内容,例如
{0}{dd/MM/yyyy}
(相同的问题:当年份剩余2位数字时,开始自动更正)。 禁用我已添加到App.xaml.cs中的以下代码段:
FrameworkElement.LanguageProperty.OverrideMetadata(
    typeof(FrameworkElement),new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(
        CultureInfo.CurrentCulture.IetfLanguageTag)));
首先要包含此代码段的原因:请查看此链接。 我在这里错过明显的东西吗?我无法在3.5中重现此内容。我真的必须滚动自己的ValueConverters才能使其正常工作吗?这看起来像是从3.5 sp 1中引入的ѭ4退了一步。
DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns(\'d\')
输出看起来确实有些不同,但是没有什么可以立即解释这种行为(可能无关): .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,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,out dt))
        {
            return dt;
        }
        return DependencyProperty.UnsetValue;
    }
}
    ,        好吧,如果您在PropertyChanged上自动更正,则此行为为“正常”。 开始退格时,传递给DateTime构造函数的值为: 屏幕>> DateTime(\'| \'是每个退格键之前的光标位置)
10-12-2000| >> DateTime(200,12,10) >> 10-12-0200

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

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

10-12-0|20 >> DateTime(20,10) >> 10-12-2020
(由于yy-mm-dd字符串格式,我认为这可能因您的文化而异) 很难,我不太明白为什么新的DateTime(20,10)在文本框中为我带来2020年。当我使用DateTime.Parse(20,10)它说我2012-10-20(yyyy-mm-dd)。除非我们使用自定义ValueConvertor,否则必须是某种我们无法控制的自动转换或解析。 我认为,如果您绝对需要“按类型输入”验证,那么自定义转换器是个不错的选择,否则OnLostFocus可以像您所说的那样很好地工作。 顺便说一句,我的文化是美国     ,        您是否尝试过DatePicker控件? http://msdn.microsoft.com/zh-CN/library/system.windows.controls.datepicker.aspx     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...