Возникла проблема с форматами при привязке данных к DatePicker. Необходимо отображать дату в формате dd.MM.yyyy
В конструкторе окна MainWindow прописано:
CultureInfo.CurrentCulture = new CultureInfo("ru-RU", false);
CultureInfo.CurrentUICulture = new CultureInfo("ru-RU", false);
Но как я понял DatePicker абсолютно игнорирует региональные настройки. Поэтому в XAML прописал вот так:
<DatePicker SelectedDate="{Binding Path=DateBirth}" Width="340" Margin="8">
<DatePicker.Resources>
<Style TargetType="DatePickerTextBox">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<TextBox x:Name="PART_TextBox"
Text="{Binding Path=SelectedDate, StringFormat={}{0:dd.MM.yyyy},
RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DatePicker.Resources>
</DatePicker>
Как бы работает, но не совсем корректно. При этом возникает следующая проблема. Данные из привязанного источника данных отображаются корректно. Но если я ввожу например дату 02.06.2018 (т. е. 2 июня 2018 года) то после завершения ввода в этой дате меняются местами число и месяц и отображается в поле и записывается в привязанный источник данных уже дата 06.02.2018 (6 февраля 2018 года). Соответственно, если например ввести дату 14.07.2012, то поле подкрашивается красной рамкой (возникает ошибка System.Windows.Data Error: 7 : ConvertBack cannot convert value '14.07.2012' (type 'String'). BindingExpression:Path=SelectedDate; DataItem='DatePicker' (Name=''); target element is 'TextBox' (Name='PART_TextBox'); target property is 'Text' (type 'String') FormatException:'System.FormatException: Строка не распознана как действительное значение DateTime. в System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) ... ).
Подскажите как можно решить проблему?
Обратите внимание, на свойство Language
, имеющееся у всех FrameworkElement
, именно оно
Возвращает или задает сведения о языке локализации и глобализации, который применяется к элементу.
Также, следует знать, что при вызове методов Convert
/ConvertBack
у конвертеров, XAML передает в них в параметре culture
значение именно из этого свойства.
Не знаю, сделано это намеренно или по ошибке, но значение этого свойства по умолчанию всегда "en-US" и не зависит от культуры текущего потока и прочего.
Это свойство зависимостей и оно наследует значения от родительских контролов, поэтому достаточно указать Language="ru-RU"
у окна и все контролы в окне будут использовать эти настройки.
Впрочем, если окон в проекте несколько, куда удобнее переопределить настройки один раз для всех контролов. Сделать это можно, например, где-то в конструкторе класса App
, добавив следующий фрагмент кода:
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(
CultureInfo.CurrentUICulture.IetfLanguageTag)));
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
С толкнулся с такой проблемой, что метод не может получить имя сервера по IPДля некоторых серверов это работает, а для некоторых нет
Как можно такое размытие реализовать? Пока только получается как на метки "My Output"
В архиве на стеллажах хранятся коробки с документамиКаждый стеллаж имеет свой штрих-код – Sххххх, где х – цифра от 0 до 9 Каждая полка на стеллажах...
В коде у 4-ех свойств повторяются сеттеры (ActivityStatus, TimeSpan(2), DataTime)Требуется убрать повторения путем написание функции