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

Chr*_*heD 10 .net c# wpf xaml .net-4.0

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

(文化是nl-BE)

我将这样的TextBox(在XAML中)与PropertyChanged上的UpdateSourceTrigger绑定到DateTime值(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>
Run Code Online (Sandbox Code Playgroud)

现在,当这个文本框的内容是(例如)10/12/2000并且我想将它编辑为09/03/1981 时,当我将光标放在2000年底并开始'退格时' 发生了一些令人讨厌的自动修正 '离开年份值(当只有'2000'的第一个数字('2')自动离开时 - 包括光标跳转 - 再次变为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)));
    
    Run Code Online (Sandbox Code Playgroud)

这个片段的原因首先包含在内:看一下这个链接.

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

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

Chr*_*heD 3

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)