项目场景:
自己写一个类继承TimePicker(管理 NuGit程序包,选择Extended WPF Toolkit 安装),初始化时,设置
Format = DateTimeFormat.Custom;
FormatString = “H:mm”;
CultureInfo tmpCultureInfo = CultureInfo.GetCultureInfo(“en-us”);
在XAML中Value值绑定ReactiveProperty < string > TimeStr
问题描述
获取到的TimeStr值未按初始化设置的内容返回,而是一个完整的时间,且当系统时间设置为德国等时间表现形式为21.08中间为点时,TimeStr的订阅中取到的值也是 XXXX.XX.XX XX.XX例如:2022.04.24 21.08
原因分析:
该控件Value的类型为DateTime类型,因此在 TimeStr.Subscribe(x =>{…});中,x的类型由DateTime类型自动根据系统设置的时间时区转换为String类型。与设置给控件的Format等参数无关。
解决方案:
①将TimeStr的类型改为DateTime类型,使用时用字符串拼接方式,例:
$“{TimeStr.Value.Hour}:{TimeStr.Value.Minute}”
②或将绑定到Value改为绑定到Text,这样可以直接获取到控件按设置格式转换后的值
其中定义Format,FormatString的类(该类重写了转换函数,因此可将Format设置于Value和Text上)继承于定义Value的类,定义Value的类继承于定义Text,CultureInfo 的类,其中一个值改变时,另一个值将根据设置的格式被赋值。
遗留问题:
在string类型的TimeStr绑定Value时,取TimeStr.Value时,其格式固定为en-us,其值未按系统设置的时间时区转换,也和控件设置的格式无关,不知是否时ReactiveProperty绑定后强制转换时,这个类固定转换成了en-us格式