【问题标题】:What is the use of ConvertBack method in IValueConverter interface?IValueConverter 接口中的 ConvertBack 方法有什么用?
【发布时间】:2011-06-21 10:50:43
【问题描述】:

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

什么时候调用?

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

我在这里问这个问题是因为:我已将 codebehind 的一个属性绑定到 TEXTBOX 的 TEXT 属性,并为该属性使用 convertor。第一个Convert 方法调用,当我在TEXTBOX 中更改TEXT 时,什么也没有发生……但只要我关闭表单,ConvertBack 方法就会调用。

【问题讨论】:

    标签: c# .net wpf ivalueconverter


    【解决方案1】:

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

    例如:您使用转换器将布尔值true 转换为字符串"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.-->
    

    【讨论】:

    • @Roel,是的,但在我的情况下,当我关闭窗口时,ConvertBack 会触发,这不是很奇怪吗?
    • 不,我认为这是正常行为:在窗口关闭之前,TextBox 的 OnFocusLost 事件将被触发,或者至少绑定会更新。
    • @Roel,如果我需要在 TEXTBOX 的 TEXT 发生任何更改后立即调用 ConvertBack 方法,我应该怎么做?正如@Dominik 所说,我找不到更新源触发器属性...
    • @Roel,INotifyPropertyChanged 接口怎么样?您是否需要在您的财产上实现它才能使“UpdateSourceTrigger=propertychanged”工作? “Mode=TwoWay”绑定何时相关?你似乎对这个区域很熟悉。
    • @MaxMazur 是的,您需要实现INotifyPropertyChanged。而TwoWay绑定是大部分控件的默认绑定(可以在控件上查看BindsTwoWayByDefault 进行确认)。例如,它与 TextBoxes 和 Checkboxes 相关,重要的是可以通过代码或通过用户输入来更新值。
    【解决方案2】:

    ConvertBack 是当您的绑定上有 mode=TwoWay 时。

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      HTH 多米尼克

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-21
        • 2011-10-27
        • 1970-01-01
        • 2016-05-29
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        • 2012-06-27
        相关资源
        最近更新 更多