Отключить преобразование / проверку текстового поля DatePicker при потере фокуса - PullRequest
1 голос
/ 16 июня 2019

В программе у меня есть одна DatePicker, которую пользователь может не вводить.Но если пользователь вводит одну дату, а затем удаляет ее, TextBox в DatePicker выполняет какую-то проверку, и я хочу отключить это.Кроме того, если я сохраню значение после этой «проверки», введенная ранее дата будет сохранена.

Image from Gyazo

Я попытался установить дату какnull, если у него нет текста, но это не работает.

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вот это:

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

1 Ответ

1 голос
/ 26 июня 2019

Свяжите свойство 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...