Какая польза от метода ConvertBack в интерфейсе IValueConverter? - PullRequest
39 голосов
/ 21 июня 2011

Какая польза от метода ConvertBack в интерфейсе IValueConverter.

Когда будет звонить?

Или каков порядок вызова из Convert и ConvertBack метода.

Я задал вопрос здесь, потому что: Я связал одно свойство codebehind с TEXT Property TEXTBOX и используя convertor для этого свойства,

затем сначала Convert метод вызывается и когда я изменяю TEXT в TEXTBOX ничего не происходит, но как только я закрываю форму ConvertBack метод вызывает.

что это, нет никаких правил , которые определяют , когда запускать ConvertBack метод?

ПРИМЕЧАНИЕ: вы можете обнаружить, что это возможно дублирование другого вопроса на этом сайте ... но не любой вопрос, который я нашел, используйте полностью в списке предложений, когда я пишу свой вопрос.

Ответы [ 3 ]

39 голосов
/ 21 июня 2011

IMO, метод ConvertBack используется для преобразования визуального представления данных в конкретный тип данных.

Например: вы используете конвертер для преобразования логического true в строку "TrueBoolean".Этот текст будет отображаться в вашем текстовом поле.Когда вы изменяете значение TextBox, метод ConvertBack будет вызван, как только сработает привязка (по умолчанию OnFocusLost).Теперь ваш метод ConvertBack попытается преобразовать новое значение в тип данных, который вам нужен.Таким образом, вам придется реализовать логику для преобразования "FalseBoolean" в false.

public class Converter : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool) value ? "TrueBoolean" : "FalseBoolean";
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var s = (string) value;
        if (s.Equals("TrueBoolean",StringComparison.CurrentCultureIgnoreCase))
            return true;
        if (s.Equals("FalseBoolean", StringComparison.CurrentCultureIgnoreCase))
            return false;
        throw new Exception(string.Format("Cannot convert, unknown value {0}", value));
    }
}

Этот метод часто используется в DataGrids, если я не ошибаюсь.

Надеюсь, это немного понятно ...

ОБНОВЛЕНИЕ
О вашем вопросе в комментарии:
Перезаписать поведение привязки по умолчанию OnFocusLostВы должны изменить свою привязку следующим образом:

<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/>
<!--syntax might differ, can't access VS at the moment.-->
29 голосов
/ 21 июня 2011

ConvertBack - это когда у вас есть mode=TwoWay на вашем переплете.

Он преобразует вводимые пользователем данные обратно в тип данных, к которому вы привязываетесь, и вызывается, когда TextBox (скажем) теряет фокус.

Например (если это не было встроено), если у вас есть число, представляющее цену, метод Convert будет принимать значение и форматировать его в строку с правильным символом валюты, десятичным разделителем и т. Д.

Если пользователь вводит новое значение, включая возможный символ валюты, разделитель тысяч и т. Д., Вы используете метод ConvertBack для анализа строки и извлечения числового значения.

Другим примером может быть ввод номера кредитной карты. Пользователь может ввести номер в виде одной строки цифр или групп цифр, разделенных пробелами или тире. Метод ConvertBack будет принимать все эти возможные входные данные и преобразовывать их в нужный вам формат.

3 голосов
/ 21 июня 2011

проверьте свойство UpdateSourceTrigger в вашей привязке.http://msdn.microsoft.com/library/system.windows.data.binding.updatesourcetrigger.aspx

Текстовое поле по умолчанию будет обновлять источник, если оно теряет фокус. Используя UpdateSourceTrigger, вы можете настроить это поведение на немедленное обновление источника, если содержимое текстового поля изменится.

HTH Dominik

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