IMultiValueConverter это значение ConvertBack (строка) для массива, совместимого с типами, указанными в targetTypes (WPF) - PullRequest
0 голосов
/ 16 ноября 2018

Я хотел бы написать IMultiValueConverter, который преобразует обратное значение (строку) в массив с объектами, совместимыми с типами, указанными в параметре targetTypes, например:

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
    if (value != null)
    {
        List<object> results = new List<object>();
        string[] arr = value.ToString().Split(' ');
        for (int i = 0; i < arr.Length; i++)
        {
            object item = (targetTypes[i])arr[i]; //ERROR: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement
        }
        return results.ToArray();
    }
    else
    {
        return null;
    }
}

Так, например, "Лондон 22" я хотел бы преобразовать обратно в "Лондон" (строка) и "2" (int). Как указано в списке типов в параметре targetTypes. И, конечно, вернуть его в виде массива.

Однако я не могу привести элементы этого массива к ожидаемому параметру targetTypes, как я прокомментировал в приведенном выше коде.

Цель, конечно, состоит в том, чтобы решить проблему, сообщенную во время привязки: «Не удается сохранить значение из цели обратно в источник.», Которая возникает, когда делается попытка сохранить строку в int.

Что сообщается, когда я использую такой преобразователь:

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
    if (value != null)
    {
        return value.ToString().Split(' ');
    }
    else
    {
      return   null;
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете попробовать что-то вроде этого:

public object[] ConvertBack(
    object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
    var strings = value.ToString().Split(' ');

    if (strings.Length != targetTypes.Length)
    {
        throw new InvalidOperationException("Invalid number of substrings");
    }

    return strings
            .Select((s, i) => System.Convert.ChangeType(s, targetTypes[i]))
            .ToArray();
}
...