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

51

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

在什么时候会被调用?

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

我之所以在这里提出问题,是因为:我已经将codebehind的一个属性绑定到了TEXTBOXTEXT属性,并且正在使用转换器(convertor)来处理该属性。第一个Convert方法被调用后,当我更改TEXTBOX中的TEXT时,没有任何变化......但是一旦我关闭窗体,ConvertBack方法就会被调用。

3个回答

50

在我看来,ConvertBack 方法用于将数据的视觉呈现转换为特定的 DataType。

例如:您使用转换器将布尔值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));
    }
}

如果我没记错的话,这种技术在数据表格中经常使用。

希望这样比较清晰明了...

更新
关于你在评论中提出的问题:
要覆盖默认的OnFocusLost绑定行为,你需要像这样更改你的绑定:

<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/>
<!--syntax might differ, can't access VS at the moment.-->

@Roel,是的,但在我的情况下,当我关闭窗口时,ConvertBack会触发,这不奇怪吗? - Aryan SuryaWansi
1
不,我认为这是正常行为:在窗口关闭之前,文本框的OnFocusLost事件将被触发,或至少绑定将会更新。 - RoelF
@Roel,如果我需要在TEXTBOX的TEXT发生任何更改时立即调用ConvertBack方法,我该怎么做?我找不到像@Dominik说的更新源触发器属性... - Aryan SuryaWansi
@Roel,关于INotifyPropertyChanged接口怎么样?你需要在属性上实现它才能使“UpdateSourceTrigger=propertychanged”起作用吗?何时使用“Mode=TwoWay”绑定是相关的?你似乎对这个领域很熟悉。 - Max Mazur
@MaxMazur 是的,你需要实现 INotifyPropertyChanged 接口。对于大多数控件来说,默认情况下都是双向绑定(你可以检查控件上的 BindsTwoWayByDefault 属性来确认)。这在文本框和复选框等控件中非常重要,因为它们的值可以通过代码或用户输入进行更新。 - RoelF

39

ConvertBack 是在绑定中使用mode=TwoWay时发生的。

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

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

如果用户输入新值 - 包括可能的货币符号、千位分隔符等,则需要使用ConvertBack方法来解析该字符串并提取其中的数值。

另一个例子可以是信用卡号码的输入。用户可以输入数字或由空格或破折号分隔的数字组成的单个字符串。ConvertBack方法将接收这些可能的输入,并将它们转换为您需要的单个格式。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接