45

接口中的ConvertBack方法有什么用。IValueConverter

什么时候会被调用?

或者调用and方法的顺序是什么?ConvertConvertBack

我在这里问了这个问题,因为:我已将代码隐藏的一个属性绑定到 TEXTBOX 的 TEXT 属性并convertor用于该属性。第一个Convert方法调用,当我没有任何改变TEXTTEXTBOX......但是只要我关闭该ConvertBack方法调用的表单。

4

3 回答 3

45

IMO,该ConvertBack方法用于将数据的可视化表示转换为特定的 DataType。

例如:您使用 Converter 将 boolean 转换为truestring "TrueBoolean"。此文本将显示在您的 TextBox 中。当您更改 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.-->
于 2011-06-21T10:56:02.337 回答
34

ConvertBack是当你有mode=TwoWay你的绑定。

它将用户输入转换回您要绑定的数据类型,并在TextBox(比如说)失去焦点时被调用。

例如(如果这不是内置的),如果您有一个代表价格的数字,该Convert方法将获取该值并将其格式化为具有正确货币符号、小数分隔符等的字符串。

如果用户输入一个新值——包括可能的货币符号、千位分隔符等,您将使用该ConvertBack方法解析字符串并提取数值。

另一个示例可以是信用卡号输入。用户可以将数字输入为单个数字串或由空格或破折号分隔的数字组。该ConvertBack方法将采用所有这些可能的输入并将它们转换为您需要的单一格式。

于 2011-06-21T11:31:24.643 回答
3

检查绑定上的 UpdateSourceTrigger 属性。 http://msdn.microsoft.com/library/system.windows.data.binding.updatesourcetrigger.aspx

默认情况下,如果文本框失去焦点,它将更新源,使用 UpdateSourceTrigger 您可以将此行为设置为在文本框内容更改时立即更新源。

HTH 多米尼克

于 2011-06-21T10:53:55.657 回答