Кажется, что StringFormat
не влияет на значение, полученное из пользовательского ввода.
Из документов :
Получает или задает строку, которая определяет, как форматировать привязку, если она
отображает связанное значение в виде строки.
Я считаю, что есть более надежное решение, но я не нашел ничего, что могло бы решить эту проблему без использования конвертеров.
public class DateTimeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var dateTime = (DateTime?)value;
if (!dateTime.HasValue)
{
return string.Empty;
}
var format = (string)parameter;
return dateTime.Value.ToString(format, culture);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
var format = (string)parameter;
DateTime dateTime;
if (DateTime.TryParseExact((string)value, format, culture, DateTimeStyles.None, out dateTime))
{
return dateTime;
}
return DependencyProperty.UnsetValue;
}
}
Хитрость в том, что в методе ConvertBack
используется DateTime.TryParseExact
, передавая формат в качестве аргумента.
Но есть недостаток - вы можете работать только с одним форматом - дд / мм / гггг. Если вы введете что-то вроде 2018-04-29 - это не сработает.
Чтобы использовать этот конвертер, вам нужно объявить его в ресурсах:
<local:DateTimeConverter x:Key="converter"/>
И используйте ConverterParameter
вместо StringFormat
(хотя вы можете использовать StringFormat
, оно будет использоваться после применения конвертера):
Text="{Binding Path=SelectedDate,
RelativeSource={RelativeSource AncestorType={x:Type DatePicker}},
Converter={StaticResource converter},
ConverterParameter='dd/MM/yyyy'}"