关于WPF DatePicker的绑定

WPF DatePicker控件非常有意思,当页面只有一个DatePicker时,绑定很正常,其Text显示为“选择日期”,属性“DisplayDate”也默认为今天,你是绑定“Text"属性也可以,绑定“SelectedDate”属性也可以,但“Text"属性应显式为 Mode=TwoWay。当页面有多个DatePicker控件时,只有最后一个控件正常,前面的“Text"属性则显示为“0001/1/1”,或者是你初始化的值,这就很头疼,如果不需要初始化值,那么就麻烦了。当“Text"属性值为string.Empty时,则显示为“选择日期”,那么就能利用这个特性编写程序,需要一个string和DateTime之间转换。另外其属性“DisplayDate”也麻烦,它的值会跟随前面一条数据的“SelectedDate”属性值,除非你重新设定它。

所以会有这样的现象,页面多个 DatePicker控件,只有最后一个还算正常,前面几个显示为“0001/1/1”,且点选后也是从0001年1月那个面板值,用户点选实在太麻烦了,除非直接输入日期,那么就失去了这个控件的意义。

解决方法:

一、绑定的数据属性为string,并初始化为string.Empty;

二、绑定DatePicker控件的“Text"属性,显式为 Mode=TwoWay;

三、编写string和DateTime之间转换程序,如Convert.ToDateTime()和ToShortDateString();

四、与数据库的连接,一个办法需要两个数据类,一个是直接连接数据库的类,与数据库表字段的数据类型一致;另一个是ViewModel类的操作类,如是DateTime的则改为string的,然后是两个类之间的转换,容易,就是麻烦点。一个办法就是直接转换。

五、新建一条数据时,应显式设定“DisplayDate”的属性值,一般为DateTime.Today

六、这里就有一个问题,string.Empty不能转换为DateTime,为此,我是设定日期“0001/1/1”就是空值,转换程序如下:

        public DateTime StringToDatetime(string sdate)
        {
            return sdate == string.Empty ? Convert.ToDateTime("0001/1/1") : Convert.ToDateTime(sdate);
        }
        public string DatetimeToString(DateTime sdate)
        {
            return sdate == Convert.ToDateTime("0001/1/1") ? string.Empty : sdate.ToShortDateString();
        }


你可能感兴趣的:(C#,wpf,wpf,datepicker,控件,binding,c#)