C# 在焦点丢失时禁用日期选择器文本框转换/验证

C# 在焦点丢失时禁用日期选择器文本框转换/验证,c#,wpf,validation,xaml,datepicker,C#,Wpf,Validation,Xaml,Datepicker,在程序中,我有一个日期选择器,允许用户不输入日期。但是如果用户输入一个日期,然后删除它,日期选择器中的文本框会进行某种验证,我想禁用它。此外,如果我在此“验证”之后保存值,则在此之前输入的日期就是保存的日期 如果没有任何文本,我尝试将日期设置为null,但这不起作用 private void PART\u TextBoxFim\u TextChanged(对象发送者,textchangedventargs e) { 如果(Dp_DataFim.Text==null) { Dp_DataFim.

在程序中,我有一个
日期选择器
,允许用户不输入日期。但是如果用户输入一个日期,然后删除它,
日期选择器中的
文本框
会进行某种验证,我想禁用它。此外,如果我在此“验证”之后保存值,则在此之前输入的日期就是保存的日期

如果没有任何文本,我尝试将日期设置为null,但这不起作用

private void PART\u TextBoxFim\u TextChanged(对象发送者,textchangedventargs e)
{
如果(Dp_DataFim.Text==null)
{
Dp_DataFim.SelectedDate=null;
Dp_DataFim.DisplayDate=DateTime.Today;
}
}
在页面的类中,我有以下内容:

public可空属性{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)'

DatePicker
SelectedDate
属性绑定到
Nullable
源属性

如果通过为
DatePickerTextBox
创建自定义
ControlTemplate
来更改日期格式,并将其
Text
属性绑定到
SelectedDate
属性,则可以使用简单的转换器类将空
字符串
转换为
默认值(日期时间?

用法:

<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>


您不能将
DateTime
属性设置为有效的
DateTime
值以外的任何值。为什么要绑定到
文本
属性?我绑定是因为我希望能够编辑时间,例如,我用按钮设置日期/时间,然后我想更正时间。为此,有
SelectedDate
属性。。。。好的,但我希望能够删除日期,并且仍然被视为有效日期,即使用户使用backspace删除,删除的日期如何成为有效日期?如果您绑定到
null
属性,则可以将其设置为
null
或有效的
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>