Каково использование метода ConvertBack в интерфейсе IValueConverter?
Что такое метод ConvertBack
в интерфейсе IValueConverter
.
Когда он вызывается?
Или что такое порядок вызова метода Convert
и ConvertBack
.
Я задаю вопрос здесь, потому что: Я связал одно свойство codebehind с TEXTBOXs TEXT Property и использовал convertor
для этого свойства,
затем сначала Convert
Метод invoke и когда я изменяю TEXT
в TEXTBOX
, ничего не происходит, но как только я закрою метод формы ConvertBack
.
что это такое, нет правил, которые определяют , когда нужно запустить ConvertBack
метод?
ПРИМЕЧАНИЕ: вы можете найти, что это возможный дубликат другого вопроса на этом сайте... но не любой вопрос, который я нашел, использовал полный список предложений, когда я пишу свой вопрос.
Ответы
Ответ 1
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, если я не ошибаюсь.
Надеюсь, это немного ясно...
UPDATE
О вас вопрос в комментарии:
Чтобы переписать поведение привязки по умолчанию OnFocusLost
, вам необходимо изменить привязку следующим образом:
<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/>
<!--syntax might differ, can't access VS at the moment.-->
Ответ 2
ConvertBack
- это когда у вас есть mode=TwoWay
на вашей привязке.
Он преобразует вход пользователя обратно в тип данных, к которому вы привязываетесь, и вызывается, когда TextBox
(скажем) теряет фокус.
Например (если это не было встроено), если у вас есть число, представляющее цену, метод Convert
примет значение и отформатирует его в строку с правильным символом валюты, разделителем десятичной дроби и т.д.
Если пользователь вводит новое значение - включая возможный символ валюты, разделитель тысяч и т.д., вы должны использовать метод ConvertBack
для синтаксического анализа строки и извлечения числового значения.
Другим примером может служить ввод номера кредитной карты. Пользователь может ввести номер в виде одной строки цифр или групп цифр, разделенных пробелами или тире. Метод ConvertBack
будет принимать все эти возможные входы и преобразовывать их в требуемый единый формат.
Ответ 3
проверьте свойство UpdateSourceTrigger на вашем Binding.
http://msdn.microsoft.com/library/system.windows.data.binding.updatesourcetrigger.aspx
Текстовое поле по умолчанию обновит источник, если он потеряет фокус, используя UpdateSourceTrigger, вы можете установить это поведение для немедленного обновления источника, если изменяется содержимое текстового поля.
НТН
Dominik