当我的用户通过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!如何确保在按钮事件代码中使用此类型的值?
谢谢!
答案 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();
}
}