[WPF] ComboBox with DateTime, Binding, Converter + Formating
От: master_of_shadows Беларусь  
Дата: 24.02.11 15:57
Оценка:
Есть вот такой ComboBox который по дизайну должен содержать только даты в формате MM/dd/yyyy:

<System:String x:Key="dateTimeFormat">{0:d}</System:String>
...
<ComboBox ItemsSource="{Binding Source={StaticResource Dates}}"
    Text="{Binding EndDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DateFromDateTimeConverter},
       ValidatesOnDataErrors=True, ValidatesOnExceptions=True, NotifyOnValidationError=True,
       StringFormat={StaticResource DateTimeFormat}}"
    IsEditable="True"
/>


В Dates находится DateTime[], EndDate имеет тип DateTime, DateFromDateTimeConverter конвертер делает следующее:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is DateTime)
                return ((DateTime)value).ToString("MM/dd/yyyy", culture);
            else
                return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is string)
            {
                DateTime result;
                if (DateTime.TryParseExact(value.ToString(), "MM/dd/yyyy", culture, DateTimeStyles.None, out result))
                    return result;                
            }
            return DependencyProperty.UnsetValue;
        }


Даты в списке комбика выглядят как: 12/20/2011 — ничего для этого не было сделанно в коде явно, т.е. комбик как-то сам так их форматирует . Что устраивает. Однако после выбора любой даты из комбика она попадает в Text проперти как 12/20/2011 00:00:00 и дёргается ConvertBack() который естественно ставит флаг ошибки. StringFormat игнорируется при наличии Converter .

Вопрос: как заставить комбик форматировать DateTime как "d" при выборе элемента из списка?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.