Привязка данных к DatePicker WPF

131
02 ноября 2019, 09:10

Возникла проблема с форматами при привязке данных к 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) ... ).

Подскажите как можно решить проблему?

Answer 1

Обратите внимание, на свойство Language, имеющееся у всех FrameworkElement, именно оно

Возвращает или задает сведения о языке локализации и глобализации, который применяется к элементу.

Также, следует знать, что при вызове методов Convert/ConvertBack у конвертеров, XAML передает в них в параметре culture значение именно из этого свойства.

Не знаю, сделано это намеренно или по ошибке, но значение этого свойства по умолчанию всегда "en-US" и не зависит от культуры текущего потока и прочего.

Это свойство зависимостей и оно наследует значения от родительских контролов, поэтому достаточно указать Language="ru-RU" у окна и все контролы в окне будут использовать эти настройки.

Впрочем, если окон в проекте несколько, куда удобнее переопределить настройки один раз для всех контролов. Сделать это можно, например, где-то в конструкторе класса App, добавив следующий фрагмент кода:

FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
    new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(
        CultureInfo.CurrentUICulture.IetfLanguageTag)));
READ ALSO
Получение имени сервера по IP

Получение имени сервера по IP

С толкнулся с такой проблемой, что метод не может получить имя сервера по IPДля некоторых серверов это работает, а для некоторых нет

119
OpenCV: размыть края изображения

OpenCV: размыть края изображения

Как можно такое размытие реализовать? Пока только получается как на метки "My Output"

127
как настроить фильтр для столбаца в excel через c#, возможно ли использовать для этого какую либо систему?

как настроить фильтр для столбаца в excel через c#, возможно ли использовать для этого какую либо систему?

В архиве на стеллажах хранятся коробки с документамиКаждый стеллаж имеет свой штрих-код – Sххххх, где х – цифра от 0 до 9 Каждая полка на стеллажах...

111
Передача разных типо данных в аргумент функции c#

Передача разных типо данных в аргумент функции c#

В коде у 4-ех свойств повторяются сеттеры (ActivityStatus, TimeSpan(2), DataTime)Требуется убрать повторения путем написание функции

115