我正在使用wpf / c#创建表单。我期待在wpf toolkit DatePicker
中以编程方式更改/解释用户输入的输入。
例如,用户键入“今天”,当控件失去焦点时,日期将被解释并使用我的c#函数设置为当前日期。
我应该收听lostFocus事件还是有更好的方法来更改输入日期的解析方式?
我不在乎更改日期选择器的显示格式。我正在使用mvvm模式开发此应用程序。
答案 0 :(得分:3)
好的,所以最后我查看了DatePicker
的源代码,并且我在转换器等方面做的不多,因为大多数东西是私有的,只有两种可用的格式是“短”和“长”。最后,我将不得不创建自己的控件,可能部分使用Aviad上面的解决方案。但是,这是一个快速的临时解决方案(其中DateHelper
是我的自定义解析器类):
public class CustomDatePicker : DatePicker
{
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
this.TryTransformDate();
}
base.OnPreviewKeyDown(e);
}
protected override void OnPreviewLostKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
this.TryTransformDate();
base.OnPreviewLostKeyboardFocus(e);
}
protected void TryTransformDate()
{
DateTime tryDate;
if (DateHelper.TryParseDate(this.Text, out tryDate))
{
switch (this.SelectedDateFormat)
{
case DatePickerFormat.Short:
{
this.Text = tryDate.ToShortDateString();
break;
}
case DatePickerFormat.Long:
{
this.Text = tryDate.ToLongDateString();
break;
}
}
}
}
}
答案 1 :(得分:1)
值转换器的典型方案。定义一个接受string
的值转换器,并将其转换为DateTime
。在您的绑定中,将UpdateSourceTrigger
定义为LostFocus
因此:
<TextBox Text="{Binding DateText,
Converter={StaticResource MyConverter},
UpdateSourceTrigger=LostFocus}"/>