ConvertBack
界面中IValueConverter
方法的用途是什么。
什么时候打电话?
Convert
和ConvertBack
方法的调用次序是什么。
我在这里提出问题是因为:我已将代码隐藏的一个属性绑定到TEXTBOX的TEXT属性,并使用convertor
作为该属性,
然后第一个Convert
方法调用,当我在TEXT
中更改TEXTBOX
时,没有任何事情发生,但只要我关闭表单ConvertBack
方法调用。
这是什么,没有任何规则定义何时触发 ConvertBack
方法?
注意:您可能会发现这可能与此网站上的其他问题重复...但在我撰写问题时,我发现在建议列表中没有使用任何问题。
答案 0 :(得分:39)
IMO,ConvertBack
方法用于将数据的可视化表示转换为特定的DataType。
例如:您使用Converter将布尔值true
转换为字符串"TrueBoolean"
。此文本将显示在TextBox中。当您更改TextBox的值时,只要绑定再次触发(默认OnFocusLost),就会调用ConvertBack
方法。现在,您的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.-->
答案 1 :(得分:29)
ConvertBack
是指你的绑定mode=TwoWay
。
它将用户输入转换回您绑定的数据类型,并在TextBox
(比如)失去焦点时调用。
例如(如果没有内置),如果您有一个代表价格的数字,Convert
方法将获取该值并将其格式化为具有正确货币符号的字符串,小数点分隔符等
如果用户输入新值 - 包括可能的货币符号,千位分隔符等,您将使用ConvertBack
方法解析字符串并提取数值。
另一个例子可能是信用卡号输入。用户可以将数字输入为由空格或短划线分隔的单个数字串或数字组。 ConvertBack
方法将采用所有这些可能的输入并将它们转换为您需要的单一格式。
答案 2 :(得分:3)
检查Binding上的UpdateSourceTrigger属性。 http://msdn.microsoft.com/library/system.windows.data.binding.updatesourcetrigger.aspx
如果文本框失去焦点,默认情况下会更新文本框,使用UpdateSourceTrigger,如果文本框内容发生更改,您可以将此行为设置为立即更新源。
HTH 多米尼克