c# - 在焦点丢失时禁用日期选择器文本框转换/验证
问题描述
在程序中,我有一个DatePicker
允许用户不输入日期的程序。但是,如果用户输入一个日期然后将其删除,则TextBox
inDatePicker
会进行某种验证,我想禁用它。此外,如果我在此“验证”之后保存值,则之前输入的日期就是保存的日期。
如果没有任何文本,我尝试将日期设置为空,但这不起作用。
private void PART_TextBoxFim_TextChanged(object sender, TextChangedEventArgs e)
{
if (Dp_DataFim.Text == null)
{
Dp_DataFim.SelectedDate = null;
Dp_DataFim.DisplayDate = DateTime.Today;
}
}
在页面的类中,我有这个:
public Nullable<DateTime> Prop { get; set; }
日期选择器的 XAML 是这样的:
<DatePicker x:Name="Dp_DataFim" Grid.Row="0" Grid.Column="2" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,250,0,0" FontSize="16" Height="20" Width="230" SelectedDate="{Binding Prop}" IsTodayHighlighted="False" SelectedDateFormat="Short" BorderThickness="0" Padding="0" BorderBrush="{x:Null}" IsTabStop="True" SelectedDateChanged="Dp_DataFim_SelectedDateChanged" Visibility="Hidden">
<DatePicker.Resources>
<Style TargetType="{x:Type DatePickerTextBox}">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<TextBox x:Name="PART_TextBox" Text="{Binding Path=SelectedDate, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}, StringFormat='dd/MM/yyyy HH:mm:ss'}" Background="#FF494949" Foreground="#FFEEEEEE" BorderThickness="0" IsReadOnly="False" TextChanged="PART_TextBoxFim_TextChanged"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DatePicker.Resources>
</DatePicker>
我注意到当这种情况发生时,我得到一个像这样的错误:
System.Windows.Data Error: 7 : ConvertBack cannot convert value '' (type 'String'). BindingExpression:Path=SelectedDate; DataItem='DatePicker' (Name='Dp_DataFim'); target element is 'TextBox' (Name='PART_TextBox'); target property is 'Text' (type 'String') FormatException:'System.FormatException: The string was not recognized as a valid DateTime value.
em System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
em System.Convert.ToDateTime(String value, IFormatProvider provider)
em System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
em System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'
解决方案
SelectedDate
将 的属性绑定DatePicker
到Nullable<DateTime>
源属性。
如果您通过为将其属性绑定到属性的位置创建自定义ControlTemplate
来更改日期格式,则可以使用简单的转换器类将空转换为:DatePickerTextBox
Text
SelectedDate
string
default(DateTime?)
public class StringToDateTimeConverter : IValueConverter
{
private const string DateFormat = "dd/MM/yyyy HH:mm:ss";
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime? dt = (DateTime?)value;
return dt.HasValue ? dt.Value.ToString(DateFormat, CultureInfo.InvariantCulture) : string.Empty;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string s = value.ToString();
if (string.IsNullOrEmpty(s))
return default(DateTime?);
DateTime dt;
return DateTime.TryParseExact(s, DateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt) ? dt : default(DateTime?);
}
}
用法:
<DatePicker x:Name="Dp_DataFim" SelectedDate="{Binding MyProp}">
<DatePicker.Resources>
<local:StringToDateTimeConverter x:Key="StringToDateTimeConverter" />
<Style TargetType="{x:Type DatePickerTextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TextBox x:Name="PART_TextBox" Text="{Binding Path=SelectedDate,
RelativeSource={RelativeSource AncestorType={x:Type DatePicker}},
Converter={StaticResource StringToDateTimeConverter}}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DatePicker.Resources>
</DatePicker>
推荐阅读
- c++ - 特征表达式调试
- javascript - 嵌套循环 JavaScript 未按预期循环
- c++ - C++ - 具有链表和一次执行一个函数的类的程序
- java - 在javafx中将Shape从awt转换为Shape
- sql-server - 将 Varchar 日期转换为日期数据类型
- javascript - 编译失败:解析错误:意外的令牌,预期的“;”
- php - 如何用用户名添加计数?
- php - 如何在 Laravel 5.6 中打印与其品牌名称相关的所有型号名称?
- pyspark - 从 pyspark agg 函数到 int
- javascript - 如何使用 javascript 将某些内容传递到新页面?