В моем приложении WPF у меня есть текстовое поле и поле со списком. В текстовом поле я отображаю значение даты и времени, а в поле со списком пользователь может решить, какую точность этой даты он хочет видеть, и какую дату он хочет ввести.
XAML:
<TextBox Text="{Binding CreationDate, Converter={StaticResource ManualPrecisionDateTimeToTextConverter}, ConverterParameter=1, Mode=TwoWay}"/>
<ComboBox x:Name="creationDatePrecisionPeriodComboBox" ItemsSource="{Binding Converter={StaticResource GetEnums}" SelectedItem="{Binding CreationDate.precisionShortcut"/>
Допустим, DataContext является только датой, подобной этой public ManualPrecisionDateTimeToolkit CreationDate;
, а GetEnums
дает все значения перечисления такого перечисления.
Ниже приведен класс помощника:
public static class ManualPrecisionDateTimeToolkit
{
public enum PrecisionPeriod { year, month, day, hour, minute, second, millisecond }
public class ManualPrecisionDateTime
{
public DateTime date { get; set; }
public PrecisionPeriod precision { get; set; }
public string ToStringWithPrecisionFromFormat(string format, List<char> separators = null)
{
string adjustedFormat = AdjustFormatToPrecision(format, this.precision, separators);
return date.ToString(adjustedFormat, CultureInfo.InvariantCulture);
}
}
public static string AdjustFormatToPrecision(string format, PrecisionPeriod precision, List<char> separators = null)
{
// it returns the format adjusted to selected precision, so for format = "yyyy-MM-dd HH:mm" and precision = month, return = "yyyy-MM"
}
}
и конвертер:
class ManualPrecisionDateTimeToTextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ManualPrecisionDateTime dateTime = value as ManualPrecisionDateTime;
string format = (Application.Current.MainWindow.DataContext as MainModel).Settings.DateTimeFormatString; // this gives a global application defined format of displaying datetime let's say format value here is "yyyy-MM-dd HH:ss"
return dateTime.ToStringWithPrecisionFromFormat(format);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string format = (Application.Current.MainWindow.DataContext as MainModel).Settings.DateTimeFormatString;
PrecisionPeriod precisionPeriod = (PrecisionPeriod)int.Parse(parameter.ToString());
string adjustedFormat = ManualPrecisionDateTimeToolkit.AdjustFormatToPrecision(format, precisionPeriod);
DateTime dateTime;
if (DateTime.TryParseExact(value.ToString(), adjustedFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
return new ManualPrecisionDateTime(dateTime, precisionPeriod);
}
}
Дисплей работает нормально. Но ввод данных не работает должным образом.
Моя проблема:
Во второй строке функции ConvertBack в приведенном выше конвертере мне нужно чтобы прочитать выбранное значение в выпадающем списке (то есть значение CreationDate.precision для текста данных) . Но ConverterParameter не может использовать привязку, так как это не свойство зависимости, которое блокирует меня.
Мультисвязывающий конвертер не помогает, потому что тогда ConvertBack будет иметь значение 2 результатов.
Мне нужен конвертер, у которого есть параметр (который я могу связать) в Функция ConvertBack.