输入文本时,DatePicker.SelectedDate不会更改

时间:2010-12-27 22:31:22

标签: wpf text datepicker wpftoolkit

当我的用户通过DatePicker中的Calander控件选择日期时,该值会正确绑定到基础对象。但是,如果用户在DatePicker中键入日期,则单击按钮,文本不会设置为SelectedDate属性。

用户必须从DatePicker中的TextBox中移除光标,才能更新绑定对象。

 <toolkit:DatePicker Name="_dpField" Grid.Column="1" MinWidth="100"
               ToolTip="{Binding Path=ToolTipText}"
               TextInput="_dpField_TextInput"
               SelectedDate="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

HELP!如何确保在按钮事件代码中使用此类型的值?

谢谢!

6 个答案:

答案 0 :(得分:17)

我找到了一个更简单的解决方案,我不需要DateConverter

我只绑定到Text属性并使用TargetNullValue=''

<DatePicker x:Name = "dpDisbursementDate" 
            Text = "{Binding NameOfMyProperty, Mode=TwoWay,    
            UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, 
            TargetNullValue=''}"/>

答案 1 :(得分:5)

您可以使用转换器将输入的文本解析为有效的日期时间

<强>示例

 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string strValue = System.Convert.ToString(value);
        DateTime resultDateTime;
        if (DateTime.TryParse(strValue, out resultDateTime))
        {
            return resultDateTime;
        }
        return value;

    }

<强>的Xaml

     <Controls:DatePicker 
     Text="{Binding OrderDate,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
     SelectedDate="{Binding RelativeSource={RelativeSource Self},Path=Text,
     Converter={StaticResource DateConverter}}">

答案 2 :(得分:2)

我能找到的唯一解决方案是通过设置Focusable="False"禁止在DatePicker中输入日期,并且只允许从日历中进行选择。这样我们至少可以确保获得正确的日期。

答案 3 :(得分:1)

这是一个简单的解决方案,即使使用欧洲/德国日期格式也可以帮助我#dd.MM.yyyy&#34;。

添加到您的xaml根元素

xml:lang="de-AT"

并且datepicker看起来像这样:

<DatePicker SelectedDate="{Binding PropertyName, StringFormat=dd.MM.yyyy}" Name="datePicker" />

希望它适合你!

答案 4 :(得分:0)

在我的特殊情况下,我有一个 Button,它在从文本更新日期之前在其 ViewModel 中启动了一个操作。但是,将下面的函数绑定到按钮 Click(同时绑定 Click 和 Action)会在操作开始之前覆盖所需的日期。

private void UpdateDateBeforeAction(object sender, RoutedEventArgs e)
{
    bool parseSuccess = DateTime.TryParse(this.myDatePicker.Text, out DateTime parsedDate);
    if (parseSuccess && this.DataContext is MyParticularViewModel vm)
    {
        vm.targetDate = parsedDate;
    }
}

编辑:实际上你甚至不需要触摸视图模型

if(parseSuccess)
{
    this.myDatePicker.SelectedDate = parsedDate;
}

答案 5 :(得分:-2)

这可能有点晚了,但我现在已经坚持了一段时间。

如果您有另一个WPF元素,您可以将焦点更改为按钮事件开始时的焦点,这将使datepicker处理在其文本框中输入的任何文本。我只用一个组合框尝试了它,但它似乎工作,它允许你仍然在你的日期有自定义格式(即2016年4月26日而不是2016年4月26日)。我假设如果你没有任何东西可以改变焦点,你也可以使用一个不可见的元素。

    private void btnInbound_Complete_Click(object sender, RoutedEventArgs e)
    {
        if (Validation())
        {
            comboInbound_Result.Focus();//THIS IS SO THAT ANY MANUAL DATEPICKER ENTRY IS ACCEPTED BEFORE THE REST OF THE BUTTON CODE IS RUN
            SQLinbound_CompleteItem();
            ClearAll();
        }
    }