我可以用欧洲表示法存储我的DateTime吗?

时间:2016-12-01 09:39:22

标签: c# wpf datetime mvvm

我正试图找到一种方法来存储我的DateTime - 欧洲表示法中的对象。现在,当我将文本框绑定到我的对象的DateTime - 属性时,它显示为MM / dd / yyyy HH:mm AM(或PM)。我想用这种表示法保存它的原因是我不能通过ToString("dd/MM/yyyy HH:MM")改变符号,因为同样的属性也用于更新其他DateTime - 属性。这将需要大量的重写(每次我检索字符串以设置另一个对象的DateTime,我必须TryParse它回到DateTime - 格式),所以我试图找出如果有办法以所需的符号保存它。

一个显然不起作用的例子,但带来了思想,

public DateTime<dd/MM/yyyy HH:mm> ModifiedAt { get; set; }

我试图看看我是否可以强制它以不同的格式跟踪,

public DateTime ModifiedAt
    {
        get { return this.modifiedAt; }
        set
        {
            var s = value.ToString("dd/MM/yyyy HH:mm");
            DateTime.TryParse(s, out this.modifiedAt);
            this.RaisePropertyChanged();
        }
    }

但无济于事。当我开始怀疑这是可能的时候,我很好奇是否有人之前遇到过这个问题。也许有一种方法可以改变绑定声明中的displaytring?当我使用MVVM时,我将viewmodel设置为datacontext,我的绑定看起来像这样,

<TextBox Text="{Binding SelectedObject.ModifiedAt, Mode=OneWay}"/>

2 个答案:

答案 0 :(得分:2)

要在不同文化(例如欧洲语言)中显示DateTime,您需要为线程设置文化,因为您必须在应用程序中使用ThreadsTasks,所以必须使用下面的代码为将来创建的所有线程和任务设置默认文化。

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("de-DE");

如果你只需要改变当前的线程文化:

System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.DefaultThreadCurrentCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentCulture;

就像你我有一个TextBox:

<TextBox x:Name="textBox"/>

如果我将当前日期/时间设置为Text属性:

textBox.Text = DateTime.Now.ToString();

日期将显示为01.12.2016 13:27:58

我的Windows文化已设置为en-us格式,因为您可以看到textbox值为de-De格式。

enter image description here

更新1:

为了设置默认文化,我建议在App类中创建一个新的构造函数,如下所示,我尝试了它的工作原理。

public partial class App : Application
{       
    public App()
        :base()
    {
        CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
        CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("de-DE");
    }

}

答案 1 :(得分:2)

在xaml中格式化您的DateTime属性。

<TextBox Text="{Binding MyDateTimeProperty, StringFormat='dd/MM/yyyy HH:mm'}"/>

As explained here