Есть ли способ заставить двусторонний MultiBinding использовать конвертер только в одном направлении? - PullRequest
4 голосов
/ 30 марта 2011

Я создал пользовательский конвертер MultiValue для выполнения некоторой логики, в то время как MultiBinding к TextBox;однако я не хочу использовать convertBack, поскольку значение привязки не имеет типа времени компиляции и преобразование по умолчанию работает отлично.Возможно ли это или я должен каким-то образом дублировать функцию одного из внутренних преобразователей по умолчанию?

Диаграмма:

values --> Convert() --> TextBox
values <---------------- TextBox

Спасибо.

Редактировать: Забылиупомяните, что я использую MultiValueConverter и MultiBinding, которые, кажется, обходят конвертер по умолчанию.

Редактировать: Чтобы расширить рассуждения об этом: у меня есть два объекта A и B (одного типа), которые я хочуредактировать одновременно в TextBox.В методе Convert я проверяю, имеют ли они одинаковое значение, и отображает ли это значение или значение по умолчанию.Если пользователь изменяет значение в TextBox, я хочу, чтобы одно и то же значение было отправлено обратно обоим A & B.

Редактировать: я решил проблему окольным путем - смотрите мой ответниже.Если у вас есть лучшее решение, я все равно буду рад его услышать.Еще раз спасибо за ваше время и помощь.

Ответы [ 5 ]

6 голосов
/ 30 марта 2011

Просто вернуть значение в конвертируемом виде

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return YourLogic(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
5 голосов
/ 30 марта 2011

Хорошо, я только что нашел решение ... Спасибо всем за публикацию предложений.

Оказывается, что если вы создадите сквозной ValueConverter (как просто возвращаемое значение для Convert и ConvertBack) и добавите его в подпривязки MultiBinding, преобразования по умолчанию произойдут, как и ожидалось. Что должно происходить, так это то, что MultiBinding вообще обходит defaultConverter вложенных привязок.

4 голосов
/ 30 марта 2011

Нет, нет способа обойти конвертер.

Как объяснил @ArsenMkrt, вам нужно будет передать исходные значения через конвертер.

Для MultiBinding это сложно, потому что вы должны иметь возможность превратить 1 значение в N. Возможно, вам придется хранить информацию в конвертере на первом проходе, чтобы помочь вам сделать это. Я редко использовал двусторонние MultiBindings в основном потому, что трудно конвертировать обратно из одного значения во многие значения.

Здесь все еще есть недостающий кусочек. Почему вы хотите передать значение по умолчанию через MultiBinding? Это невозможно. MultiBinding всегда нуждается в преобразователе, потому что вы складываете несколько значений в одно, а затем расширяете одно значение на несколько.

1 голос
/ 30 марта 2011

Как насчет этого:

MyType Default { get; set; }

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    // compare values, return value if equal or default
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
    return Enumerable.Repeat(value, targetTypes.Length).ToArray();
}

Функция возврата передает значение обратно всем источникам MultiBinding.

0 голосов
/ 30 марта 2011

Нельзя использовать преобразование «по умолчанию» и одновременно использовать настраиваемый преобразователь значений. Таким образом, вам нужно реализовать преобразование «по умолчанию» в вашем пользовательском конвертере значений. Что-то вроде этого использует TypeConverter по умолчанию целевого типа:

public class MyConverter : IMultiValueConverter {

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        return System.Convert.ToString(values[0]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) {
        // Get the type of the value, but assume string if it's null
        Type valueType = typeof(string);
        if (value != null)
            valueType = value.GetType();

        // Convert value to the various target types using the default TypeConverter
        object[] values = new object[targetTypes.Length];
        for (int i = 0; i < values.Length; i++) {
            TypeConverter typeConverter = TypeDescriptor.GetConverter(targetTypes[i]);
            if (typeConverter != null && typeConverter.CanConvertFrom(valueType))
                values[i] = typeConverter.ConvertFrom(value);
            else
                values[i] = value;
        }
        return values;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...