WPf Datepicker输入修改

时间:2010-01-04 16:22:48

标签: c# .net wpf mvvm datepicker

我正在使用wpf / c#创建表单。我期待在wpf toolkit DatePicker中以编程方式更改/解释用户输入的输入。

例如,用户键入“今天”,当控件失去焦点时,日期将被解释并使用我的c#函数设置为当前日期。

我应该收听lostFocus事件还是有更好的方法来更改输入日期的解析方式?

我不在乎更改日期选择器的显示格式。我正在使用mvvm模式开发此应用程序。

2 个答案:

答案 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}"/>