Альтернатива для привязки ConverterParameter для Convert Back? - PullRequest
0 голосов
/ 12 апреля 2020

В моем приложении 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.

...